为不同方向使用不同布局时,在方向更改时保存片段状态

Posted

技术标签:

【中文标题】为不同方向使用不同布局时,在方向更改时保存片段状态【英文标题】:Save fragment state on orientation change when using different layouts for different orientations 【发布时间】:2014-11-28 00:28:54 【问题描述】:

我有不同的纵向和横向模式布局。 layout\activity_main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_ >

    <FrameLayout android:id="@+id/container"
        android:layout_
        android:layout_/>

</RelativeLayout>

还有layout-large\activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:orientation="horizontal" >

    <fragment
        android:id="@+id/fragment1"
        android:name="com.example.fragmentorientationchangetest.Fragment1"
        android:layout_
        android:layout_
        android:layout_weight="1" />

    <fragment
        android:id="@+id/fragment2"
        android:name="com.example.fragmentorientationchangetest.Fragment2"
        android:layout_
        android:layout_
        android:layout_weight="1" />

</LinearLayout>

我的片段是一样的,fragment1.xmlfragment2.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    >

    <TextView
        android:id="@+id/text"
        android:layout_
        android:layout_
        android:text="Fragment 2" />

    <EditText android:id="@+id/input"
        android:layout_
        android:layout_
        android:layout_margin="4dp"
        android:layout_below="@+id/text"/>
</RelativeLayout>

我想要的是当我在片段的编辑文本中输入一些文本并旋转屏幕时,编辑文本不会丢失其输入文本。

由于纵向和横向模式的片段不是一个实例,我不能使用setRetaintInstanceonSaveInstanceState。如果不定义两个活动并且不使用onConfigurationChanged,我该如何做到这一点?

注意:无需添加任何代码,每个片段都会保存其数据。因此,如果我以纵向模式在 fragment2 中输入一些文本并旋转到横向并再次旋转到纵向模式,我会看到输入的文本。

【问题讨论】:

“我想要的是当我在片段的编辑文本中输入一些文本并旋转屏幕时,编辑文本不会丢失其输入文本。”和“注意:不添加任何代码,每个片段都会保存其数据。因此,如果我以纵向模式在片段2中输入一些文本并旋转到横向并再次旋转到纵向模式,我会看到输入的文本。” 那么问题是什么?旁注:如果您要编辑您的问题,请在有人回答后添加编辑或更新 @mmlooloo 我处于纵向模式。我在编辑文本中输入了一些文本,然后旋转到横向。我没有看到输入的文字,然后再次将屏幕旋转到纵向模式,我看到了输入的文字。从陆地到港口,反之亦然,我应该怎么做才能看到输入的文字? 因为您的片段不是一个实例,您的问题实际上属于片段通信类别,我认为我的解决方案是最简单的一个。你可以等待其他人,但我的解决方案就是我的答案。 【参考方案1】:

随着我编码的更多,我有时会忽略简单的想法,例如:

SharedPreferences myText = getSharedPreferences("txt", 0);
SharedPreferences.Editor editor = settings.edit();
editor.putString("userText", "Your text that you want to save");
editor.commit();

阅读:

SharedPreferences myText = context.getSharedPreferences("txt", 0);
String userInput = myText .getString("userText", "");

然后根据userInput 设置您的editText。

【讨论】:

我知道可以通过使用其他组件(例如SharedPreferencesBroadCastReceiver)或对片段实例进行静态引用。但我认为它们不是好主意,因为它们不是为这种情况而设计的。 没有onSaveInstanceStatesetRetaintInstance 你最后的选择是SharedPreferences 你提到的其他组件根本不适合而且也很危险,比如“静态引用片段实例” 但是我通过在主要活动中使用onSaveInstanceState 而不是通过检查显示哪个片段来做到这一点,我认为必须有另一种方便的方法来做到这一点。

以上是关于为不同方向使用不同布局时,在方向更改时保存片段状态的主要内容,如果未能解决你的问题,请参考以下文章

在片段中在运行时更改方向时更改布局而不重新创建视图

在 VS blend 中为不同方向设计布局 - 不需要的更改

手动设置片段的屏幕方向

方向更改时不可见的片段

在 Interface Builder 中使用 Auto Layout 更改方向

方向/配置更改后如何维护 ListView 片段状态?