13

更改布局时多次使用 setContentView 是否不好?

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

还有其他东西可以使用按钮更改布局吗?

4

3 回答 3

13

让我们看一下Android 文档

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

因此,setContentView将覆盖布局,并将其替换为新布局。通常,您只想在 onCreate 中执行一次。从理论上讲,您可以做更多,但它涉及重新绘制整个布局,这可能需要一些时间。有几种选择,具体取决于您想要什么:

  1. ViewAnimator:如果您想快速连续多次更改视图,这对于显示快速动画很有用。
  2. 片段- 您可以切换片段,而不是重新绘制整个视图。每个片段都是一种迷你活动,总体而言,这将包含更好的代码。
  3. 传递意图参数- 将信息传递给活动以帮助其设置。第一个活动将信息传递给公共的第二个活动,后者知道如何根据从第一个活动接收到的信息进行自我设置。

至于您的具体应用,我会这样做:

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

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()
于 2014-03-06T15:00:48.097 回答
1

是的,这很糟糕,因为它会使您的活动与您的布局一起膨胀,并且如果您的布局有很多视图,则可能需要一些时间。

为避免这种情况,您应该使用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));
于 2014-03-06T15:21:22.283 回答
0

我无法展示示例,因为我正在等待答案。好的,我有歌词应用程序(它将显示乐队的歌词)和专辑是新活动,但我不想要很多活动,这就是为什么我只想制作歌曲布局并通过按钮按下来更改视图

听起来你正在以错误的方式解决这个问题。如果您想更改Activity包含的 UI,那么Fragments 将是更好的方法。那里有一些学习曲线,但它是很好的 android 设计,并且有据可查

此外,您似乎混淆了格式和内容。如果您要显示歌词,则不需要为每首歌曲设置新的布局。您只需要更改歌词并将它们保持在相同的活动中。您所做的类似于为您打算访问的每个网页创建一个新的网络浏览器。相反,找到一种方法来存储歌词并将它们显示在单个活动(或片段中)以显示这些歌词。这同样适用于每张专辑:一个活动将在角落(或作为背景)显示专辑封面、标题、发行日期等,作为文本,然后是下面的歌曲列表。s的实际内容TextView可以改变,但布局应该是一样的。

于 2014-03-06T15:08:50.947 回答