android恢复在backstack中的片段的实例状态

时间:2015-06-05 05:02:01

标签: java android listview android-fragments android-listview

嗨,我有一个有两个片段的活动。

  1. 片段A
  2. 片段B

    • 片段A有一个EditText和一个ListView。
    • 一旦我在EditText中输入内容并点击 Enter ,我就会填充ListView。
    • 现在Fragment A的ListView中填充了数据。
    • 单击片段A的ListView上的任何项目将用户发送到片段B
    • 此时我正在用片段B替换片段A
    • 因此,当用户点击按钮时,他会回到片段A
  3. 现在的问题是,如果用户在片段B中并且配置更改发生像屏幕旋转等不止一次,那么我的ListView为空,因为我的arraylist为空。

    请注意,我在片段A和片段B中使用onSavedInstanceState。 如果我当前的片段是片段A并且发生了配置更改,则恢复状态没有问题,因为在onCreateView中我从bundle获取了arraylist。

    我知道当我从片段B回复到之前在backstack中的片段A时,我的arraylist为null的原因。当片段A在backstack中时,被调用的唯一方法是onSaveInstanceState,因此在第一个配置更改后我的arraylist field为null,因为我无法将存储在savedInstateState包中的arraylist分配给arraylist字段。

    我不想在清单中使用android:configchanges属性。

    我的问题是如何恢复后台堆栈中的片段状态。

3 个答案:

答案 0 :(得分:2)

通过将该片段的所有细节传递给主要活动,然后将其添加到backstack并将状态保存在main活动的savedInstance状态以及每当后台堆栈更改和之前的片段时,我实现了保留backstack中片段状态的目标是可见的我从主活动传递该片段的已保存实例状态,这样我保留状态。我不确定这是否是正确的做法。

答案 1 :(得分:2)

我已经完成了你的方案。 基本上,当你在片段的savedinstanceState中添加arraylist时,你正在做正确的工作,但根据我,你在你的活动中没有做错。

当方向更改时,调用onDestroy然后onCreate在该方案中,如果您没有检查您的片段是否已添加,那么它将用新的片段替换它。 这是你应该放在onCreate()

上的代码
 FragmentManager fragmentManager = getFragmentManager();
    Fragment fragment = fragmentManager.findFragmentByTag("FragmentA");
    if(fragment==null){
        fragmentManager.beginTransaction().add(R.id.container, new FrgamentA(), "FragmentA").commit();
    }

另一点是当您希望保留第一个片段时添加

setRetainInstance(true);

在onCreate of fragment。

请在GitHub上找到这个演示 inpulse-fragment

在第一个片段的演示中,当您将增加计数器时,它将出现在上面的文本视图中,如果您单击该文本视图,您将导航到片段B.现在您可以尝试旋转。 如果有任何疑问,请告诉我。

答案 2 :(得分:1)

您可以在setRetaininstance(true)和此行使用onAttach 活动清单文件中的ConfigChanges = "screenSize|keyBoardHidden|orientation"