2014-09-03 2 views
1

Мне интересно, может ли кто-нибудь объяснить мне, почему при раздувании макета, если в ViewGroup указано, что более позднее removeView() ничего не делает. То есть:Макет Inflater, ViewGroup и removeView()

в OnCreate:

currentView = this.findViewById(android.R.id.content).getRootView(); 
    vg = (ViewGroup) currentView; 

в более поздний метод:

  getHelp.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        LayoutInflater inflater = GraphicsActivity.this.getLayoutInflater(); 
        final View faqView = inflater.inflate(R.layout.graphfaq, vg); 


        final View faqClose = findViewById(R.id.graph_faq_close); 
        faqClose.setOnClickListener(new View.OnClickListener() { 
         @Override 
         public void onClick(View v2) { 
          if (MainActivity.debug) Log.i(TAG,"inside faqClose listener"); 
          vg.removeView(faqView); 
         } 
        }); 
       } 
      }); 

это раздувает и отображает faqVIew должным образом, но, когда второй clickListener срабатывает, вид не удаляется.

Однако, делая это таким образом делает удалить вид, когда щелкнул закрыть:

    final View faqView = inflater.inflate(R.layout.graphfaq, null); 
        vg.addView((faqView)); 

Просто пытается получить лучшее понимание того, как все это работает.

ТИА

ответ

2

Из документов:

общественного мнение надуйте (интермедиат ресурс, ViewGroup корень)

Возвращает Корневой Вид надутой иерархии. Если был установлен корневой каталог, это корневой вид; в противном случае это корень завышенного XML-файла .

Значение:

vg.removeView(faqView); 

интерпретируется как:

vg.removeView(vg); 

Который не существует там, поэтому он не может быть удален.

Edit:

Позволь мне мои слова иначе: vg не может быть удален из vg, поскольку представление не существует сам по себе.

Комментарий: если вы не пропустите корень, ваше представление не будет прикрепляться ни к чему, но оно будет завышено.

код иногда объясняет это лучше:

// This returns vg // Basically faqView == vg 
View faqView = inflater.inflate(R.layout.graphfaq, vg); 

// This find the layout you attached 
View yourView = faqView.findViewById(R.id.graphfaq_layout); 

// This removes the layout 
faqView.removeView(yourView); 

Как это было сказано много раз Android Docs являются загадочными. Вы должны прочитать его несколько раз, чтобы узнать, что происходит.

+0

Я вроде как понимаю, что вы говорите, но не совсем. Итак, когда вы когда-нибудь проходите фактическую группу просмотра на надув? И в чем смысл? – TrustNoOne

+0

@TrustNoOne Точка очевидна. Чтобы получить представление, которое вы надуваете, подключено к ViewGroup. Если вы не передадите корневой режим, вашему представлению не будет ничего. – Simas

+0

Извините, думаю, я просто плотный. Вы в одном месте говорите, что передача vg не получает добавленную точку зрения, а затем в комментарии вы говорите, что это так. – TrustNoOne