2014-09-03 88 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)); 

只是想获得更好的理解这一切是如何工作的。

TIA

回答

2

从文档:

公众查看充气(INT资源,根的ViewGroup)

返回膨胀层次的根查看。如果root提供, 这是根View;否则它是充气XML文件的根源。

含义:

vg.removeView(faqView); 

被解释为:

vg.removeView(vg); 

不存在在那里,因此它不能被删除。

编辑:

让我把我的话是不同的: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的文件是隐藏的。你需要阅读几遍才能知道发生了什么。

+0

我有点看到你在说什么,但不是真的。那么你什么时候将实际的视图组传递给inflater?那又有什么意义呢? – TrustNoOne 2014-09-03 17:27:09

+0

@TrustNoOne这一点很明显。要获得视图,请将视角添加到ViewGroup中。如果您没有传递根视图,那么您的视图将没有任何附加内容。 – Simas 2014-09-03 17:33:56

+0

对不起,你猜我刚刚密集。你在一个地方说传递vg不会添加视图,然后在评论中你说的是。 – TrustNoOne 2014-09-05 17:44:13