【问题标题】:Android: is using setContentView multiple times bad while changing layouts?Android:在更改布局时多次使用 setContentView 是否不好?
【发布时间】:2014-04-09 07:02:33
【问题描述】:

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

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

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

【问题讨论】:

  • set content view 唯一要做的就是渲染布局树并设置根。如果多次执行,性能会很糟糕,但没有内在的理由不应该这样做。
  • 你能举个例子吗?
  • 我无法显示示例,因为我正在等待答案。好的,我有歌词应用程序(它将显示乐队的歌词)和专辑是新活动,但我不想要很多活动,这就是为什么我只想制作歌曲的布局并通过按钮按下来更改视图

标签: android android-layout android-activity setcontentview


【解决方案1】:

我们来看看Android Documents

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

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

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

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

  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()

【讨论】:

  • 所以最好为歌词屏幕制作一项活动并在按钮单击时更改文本?
  • 您最多只能有 1 个歌词活动。最好使用 Fragments,因为这将允许您构建一个平板电脑视图,但同样,只需要一个 Fragment。仔细查看我链接的 Fragments 文档,我相信它们所做的事情与您想要做的事情非常相似,并且整体看起来会更好。
【解决方案2】:

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

为避免您应该使用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));

【讨论】:

    【解决方案3】:

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

    听起来你做错了。如果您想更改 Activity 包含的 UI,那么 Fragments 将是更好的方法。那里有一点学习曲线,但它是很好的 android 设计,well documented

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-24
      • 1970-01-01
      • 2011-09-23
      • 2022-01-13
      • 1970-01-01
      • 2021-06-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多