可以将多个视图添加到活动的根视图吗?

时间:2014-01-21 16:02:46

标签: android

这可能听起来很愚蠢,但实际上我找不到任何东西。 可以在Android中的活动根视图中添加多个视图吗?

所以例如我可以这样:

setContentView(R.layout.main);
setContentView(gLView);
setContentView(otherView);

或者只是将其作为视图检索

FrameLayout layout = (FrameLayout)this.getWindow().getDecorView().findViewById(android.R.id.content);
layout.addView(view1);
layout.addView(view2);
layout.addView(view3);
layout.addView(view4);

这一切似乎都适用于我测试的设备,但它是否可以保证对所有设备都有效? 或者我应该人为地创建单个FrameLayout以添加到根视图并将所有内容添加到此FrameLayout

更多实验 1)如果我不使用setContentView并打印:

Log.d("Test", this.getWindow().getDecorView().findViewById(android.R.id.content).getClass().getName());

我得到:android.widget.FrameLayout

2)如果我将内容视图设置为例如GLSurfaceView并打印相同的Log.d 它还会打印android.widget.FrameLayout

3)如果我根本不使用setContentView,只需执行

FrameLayout layout = (FrameLayout)this.getWindow().getDecorView().findViewById(android.R.id.content);
layout.addView(myView);

它附加了视图

所以我假设android.R.id.content不是你setContentView设置的,而是你设置的内容,或者活动中的实际根视图(结果是FrameLayout?)

我可以通过这种方式添加多个孩子,但问题是: 我可以这样做吗?

3 个答案:

答案 0 :(得分:3)

是的,在根级别添加多个内容View是完全可以的。内容View只是简单地添加到FrameLayout容器中,如果FrameLayout只需要View,则最好将其用于布局,而不是添加额外的容器层。

如果您要添加新内容addContentView(),则应使用setContentView()方法代替View,这样会导致替换现有内容。

此外,还可以使用<merge> tag将多个FrameLayout添加到XML布局的内容容器中,这只会替换基础{{1}}。

答案 1 :(得分:1)

多次调用setContentView只会替换之前设置的任何视图。因此,您要做的是创建一个根视图,其中包含您要添加的多个视图,并使用setContentView将根视图设置为您的活动。您使用FrameLayout的第二个示例是一个很好的方法。

答案 2 :(得分:0)

您的方法在某种程度上是有效的。但是在活动中调用setcontentView()的好习惯。

这是因为维护活动生命周期并减少因布局泄漏导致的应用程序崩溃非常容易。

我个人一次调用setcontentView()。我在单个XML文件中定义了所有布局。我打电话给setVisibility(View.VISIBLE)setVisibility(View.INVISIBLE)setVisibility(View.GONE)来显示或隐藏包含我某些观点的任何特定布局。

修改

此外,在XML中调整布局非常容易,因为您可以使用简单的拖放操作。如果您使用relativeLayout,则可以非常轻松地将任何视图放置在任何位置。但在Java代码中,将视图置于所需位置有些困难

希望这会有所帮助:)