调用多次setContentView()函数

15

在一个Activity中是否有一种方法可以多次调用setContentView(id)并使用不同的id来呈现不同的视图,或者我一定要开启一个新的Activity?

3个回答

10

根据Austyn的评论,我找到了另一个帖子中有关如何使用ViewFlipper完成此操作的指导(请参阅标记为选定答案的顶部答案这里)。

如果您不想使用ViewFlipper,我在这里找到了一个很好的例子,说明如何在同一视图中切换布局:

XML:

<FrameLayout 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    xmlns:android="http://schemas.android.com/apk/res/android">
    <ImageView 
        android:src="@drawable/icon"
        android:scaleType="fitCenter"
        android:layout_height="fill_parent"
        android:layout_width="fill_parent"/>
    <TextView
        android:text="Learn-Android.com"
        android:textSize="24sp"
        android:textColor="#000000"
        android:layout_height="fill_parent"
        android:layout_width="fill_parent"
        android:gravity="center"/>
</FrameLayout>

代码:

private void SwitchLayout2() {
RelativeLayout Layout1 = (RelativeLayout)findViewById(R.id.layout1);
RelativeLayout Layout2 = (RelativeLayout)findViewById(R.id.layout2);

// Enable Layout 2 and Disable Layout 1
Layout1 .setVisibility(View.GONE);
Layout2.setVisibility(View.VISIBLE);
}

private void SwitchLayout1() {
RelativeLayout Layout1 = (RelativeLayout)findViewById(R.id.layout1);
RelativeLayout Layout2 = (RelativeLayout)findViewById(R.id.layout2);

// Enable Layout 1 & Disable Layout2
Layout1.setVisibility(View.VISIBLE);
Layout2.setVisibility(View.GONE);
}

4
你应该使用一个ViewFlipper来完成这个任务,而不仅仅是改变每个 View 的可见性。 - Austyn Mahoney
1
@AustynMahoney,了解使用ViewFlipper而不是glenviewjeff所描述的方法的最佳实践原因将是很好的。 - user438293456
为什么要重新发明轮子,当Android已经提供了一种非常简单的方法来完成这个确切的事情呢?如果你想将其扩展到3个布局,或者可能是18个布局,那会发生什么?如果你使用ViewFlipper,它就非常简单,如果你没有使用,那么维护那个代码库就祝你好运了。 - Austyn Mahoney
1
给定的示例链接正在建设中。 - Pratik Butani
使用archive.org进行修复 @PratikButani - Jeff Axelrod
1
这将导致不必要的内存负载。每个布局都会被创建并保留在内存中,当您使它们可见/不可见时,它们只是在隐藏状态下显示。因此,如果您有5个布局,您会不必要地加载大量UI组件,这就是为什么这是一个糟糕的设计的原因。 - Codevalley

3
不,你不能轻易地多次调用它。你需要完全删除所有视图,然后填充新的布局,或者使用ViewFlipper(或FrameLayout)在不同视图之间切换。
顺便说一下,这个问题以前已经被问过了,尽管我不能立即找到它。

0

您可以在您的活动中尝试这个:

getWindow().addContentView(View, ViewGroup.LayoutParams);

这两个内容视图将会一个在另一个上面。但是,没有一种直接的方法可以移除以这种方式添加的某个视图。

还要注意,在最后一次调用之后调用 setContentView 将会移除所有先前添加的内容视图。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接