0

我刚刚开始在我的应用程序中使用片段,这个想法是一列用于特定宽度(或更小)的屏幕,两列用于更宽的屏幕。所以我有两个独立的布局文件,在 MainActivity 的 onCreate 方法中,我根据屏幕宽度选择显示哪一个。因为我对屏幕宽度而不是方向感兴趣,所以我不能使用更简单的“layout-land”选项。两种布局都使用相同的片段,但它们不能硬编码到布局文件中,因为其中一些需要在运行时添加和删除 - 因此我在 onCreate 方法中使用片段事务来(目前)添加碎片。

当活动被销毁并重新创建时,问题就出现了。如果我不检查 savedinstancestate 是否为空,它会再次添加片段(这是意料之中的),一切都会加倍。但是,如果我只在它为空时执行创建代码——就像只有一个布局时那样——那么当我再次测试屏幕宽度并只使用 setContentView(一种或另一种布局)时,它会重新创建显示没有问题的那个但另一个是空白的。这也是意料之中的,因为第二个还没有被实例化。那么是否可以从已保存的实例状态中确定活动被销毁时正在使用的布局?如果是的话,是否可以(或安全)使用其中的信息来创建其他布局 - 还是我应该再次运行创建代码?换句话说,当使用多个布局时,标准的已保存实例状态是否会保留我需要的所有数据,还是我必须自己做这一切?

4

1 回答 1

0

您仍然可以使用资源存储桶来包含您的布局。IE:

use //layout-sw600dp即布局最小宽度为600 dip

来自官方文档 http://developer.android.com/training/multiscreen/screensizes.html#TaskUseSWQuali

res/layout/main.xml,单窗格(默认)布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <fragment android:id="@+id/headlines"
              android:layout_height="fill_parent"
              android:name="com.example.android.newsreader.HeadlinesFragment"
              android:layout_width="match_parent" />
</LinearLayout>

res/layout-sw600dp/main.xml,两窗格布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal">
    <fragment android:id="@+id/headlines"
              android:layout_height="fill_parent"
              android:name="com.example.android.newsreader.HeadlinesFragment"
              android:layout_width="400dp"
              android:layout_marginRight="10dp"/>
    <fragment android:id="@+id/article"
              android:layout_height="fill_parent"
              android:name="com.example.android.newsreader.ArticleFragment"
              android:layout_width="fill_parent" />
</LinearLayout>
于 2013-07-26T23:57:06.617 回答