我想知道是否有人可以向我解释为什么在给布局膨胀时,如果指定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
答案 0 :(得分:2)
来自文档:
public View inflate(int资源,ViewGroup根目录)
返回膨胀层次结构的根视图。如果提供了root, 这是根视图;否则它是膨胀的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 Docs很多时候都很神秘。你需要阅读几次才能了解情况。