2014-03-06 19 views
8

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

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

和是否有其他一些事情来改变布局使用按钮?

+0

设置内容视图的唯一功能是渲染布局树并设置根目录。如果多次完成,性能很糟糕,但没有内在的原因,你不应该这样做。 – Simon

+0

你能举一个例子吗? – PearsonArtPhoto

+0

我无法显示示例,因为我在等待答案。 好吧我有应用程序的歌词(它会显示乐队的歌词)和专辑是新的活动,但我不想要很多活动,这就是为什么我想只歌曲布局和按钮按 – Brsgamer

回答

8

让我们来看看Android Documents

设置活动内容,以明确的看法。该视图直接放置在活动的视图层次结构中。

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

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

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

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

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

改变意见,所以它会很好为歌词屏幕制作一个活动并在按钮上单击更改文字? – Brsgamer

+0

您最多只能有1首歌词。更好的做法是使用Fragments,因为这可以让你构建一个平板视图,但是同样只需要一个片段。仔细看看我链接的Fragments文档,我相信他们做的事情与你想做的事情非常相似,并且整体看起来会更好。 – PearsonArtPhoto

+0

谢谢,将来看看吧 – Brsgamer

0

我不能显示的例子,因为我在等回答做到这一点。好吧,我 有歌词的应用程序(它会显示带的歌词)和专辑是新 活动,但我不想多的活动和这就是为什么我想 使歌曲只布局和改变与按钮按下的意见

这听起来像你正在以这种错误的方式去做。如果您想要更改UI Activity包含,那么Fragment将是更好的方法。这里有一些学习曲线,但它是很好的android设计,并且well documented

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

0

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

为了避免这种情况,你应该使用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));