Android:多次使用setContentView坏时更改布局?

在更改布局时多次使用setContentView?

有人说这很糟糕,他们从来不说为什么。

有没有其他的事情来改变使用button的布局?

Solutions Collecting From Web of "Android:多次使用setContentView坏时更改布局?"

我们来看看Android文档 :

将活动内容设置为显式视图。 该视图直接放置在活动的视图层次结构中。

所以, setContentView将覆盖布局,并用新的replace它。 通常,你只想在onCreate中做一次。 从理论上讲,你可以做得更多,但是需要重新绘制整个布局,这可能需要一些时间。 有几种select,具体取决于你想要的:

  1. ViewAnimator :如果您想快速连续多次更改视图,这对于显示快速animation非常有用。
  2. 碎片 – 而不是重新绘制整个视图,您可以切换出碎片。 每个片段是一种迷你活动,总的来说,这将包含更好的代码。
  3. 传递意图参数 – 将信息传递给活动以帮助设置。 第一个活动将信息传递给一个普通的第二个活动,该活动知道如何根据从第一个活动收到的信息来设置自己。

至于你的具体应用,这是我会做的:

  1. 每个乐队都遵循特定的布局。 只有一个或者几个可能的布局。
  2. 当乐队活动开始时,select适当的布局,并填充,知道里面有什么。

Android SDK显示了如何将数据从一个活动传递到另一个活动。 只需从第一个传递第二个活动需要的数据,使用如下所示:

 Intent intent=new Intent(...); intent.putExtra("Album","Some Album") startActivity(intent); 

第二项活动将做到这一点:

 Intent intent=getIntent(); String albumName=intent.getExtraString("Album"); //Does something with albumName, maybe get a TextView and .setText() 

我不能显示示例,因为我在等待答案。 好吧,我有歌词的应用程序(它会显示乐队的歌词)和专辑是新的活动,但我不想要很多活动,这就是为什么我想使歌曲只有布局和button按下更改视图

这听起来像你正在做这个错误的方式。 如果你想改变一个Activity包含的UI,那么Fragment就是更好的方法。 这里有一些学习曲线,但是这是很好的androiddevise,并有很好的文档 。

此外,你似乎混淆了格式和内容。 如果您正在显示歌词,则不需要为每首歌曲添加新的布局。 你只需要改变歌词,并保持在同一个活动。 你正在做什么类似于为您打算访问的每个网页创build一个新的网页浏览器。 相反,find一种方法来存储歌词,并将其显示在单个活动(或片段)中以显示这些歌词。 每个专辑都是一样的:一个活动将在angular落(或作为背景),标题,发行date等作为文本显示专辑封面,然后显示下面的歌曲列表。 TextView的实际内容可以改变,但是布局应该是一样的。

是的,这是不好的,因为它扩大了你的布局活动,如果你的布局有很多的意见,可能需要时间。

为了避免这种情况,您应该使用ViewAnimator ,在其中放置所有布局,并通过showNext()和showPrevious()进行切换,即:

 <ViewAnimator xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/ViewAnimator" android:layout_width="fill_parent" android:layout_height="fill_parent" > <RelativeLayout> </RelativeLayout> <RelativeLayout> </RelativeLayout> </ViewAnimator> 

在你的代码中:

 // Don't forget the setContentView // // Load the ViewAnimator and display the first layout ViewAnimator va = (ViewAnimator) findViewById(R.id.ViewAnimator); // Switch to the second layout va.showNext(); // Add another layout at the third position LinearLayout fooLayout = new LinearLayout(this); va.addView(fooLayout, 3, new ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT));