1

我想知道是否有人可以向我解释为什么在膨胀布局时,如果指定了 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

4

1 回答 1

2

从文档:

公共视图膨胀(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 是神秘的。你需要读几遍才能知道发生了什么。

于 2014-09-03T16:37:49.247 回答