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

时间:2014-03-06 14:51:17

标签: android android-layout android-activity setcontentview

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

有些人说这很糟糕,他们从不说明原因。

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

3 个答案:

答案 0 :(得分:9)

我们来看看Android Documents

  

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

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

  1. ViewAnimator:如果您想快速连续多次更改视图,这对于显示快速动画非常有用。
  2. Fragments - 您可以切换片段,而不是重新绘制整个视图。每个片段都是一种迷你活动,总体来说这将更好地包含代码。
  3. Pass Intent Arguments - 将信息传递给活动以帮助其设置。第一个活动将信息传递给常见的第二个活动,该活动知道如何根据从第一个活动收到的信息设置自己。
  4. 至于你的具体应用,我会这样做:

    1. 每个乐队都遵循特定的布局。只有一种或几种可能的布局。
    2. 当Band活动开始时,选择适当的布局并填充,知道其中的内容。
    3. 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()
      

答案 1 :(得分: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));

答案 2 :(得分:0)

  

我无法展示示例,因为我正在等待回答。好的我   有歌词的应用程序(它将显示乐队的歌词)和专辑是新的   活动,但我不想要很多活动,这就是我想要的原因   只按歌曲布局并按下按钮

更改视图

听起来你正在以错误的方式解决这个问题。如果您要更改Activity包含的用户界面,那么Fragment将是更好的方法。那里有一点学习曲线,但它的设计很好,well documented

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