繁体   English   中英

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

[英]android restore instance state of a fragment that is in backstack

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

  1. 片段A
  2. 片段B

    • 片段A具有一个EditText和一个ListView。
    • 在EditText中输入内容并按Enter后 ,将填充ListView。
    • 现在,片段A的ListView中已填充数据。
    • 单击片段A的ListView上的任何项目都会将用户带到片段B
    • 此时,我正在用片段B替换片段A
    • 因此,当用户单击“后退”按钮时,他返回到片段A

现在的问题是,如果用户位于片段B中,并且配置更改(例如屏幕旋转等)发生了多次,那么我的ListView为空,因为我的arraylist为null。

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

我知道为什么我从片段B返回到先前在后堆栈中的片段A时arraylist为空的原因。当片段A在后堆栈中时,唯一被调用的方法是onSaveInstanceState,因此在第一次配置更改后,我的arraylist字段为null因为我无法将存储在saveInstateState捆绑包中的arraylist分配给arraylist字段。

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

我的问题是我该如何恢复堆栈中的碎片状态。

我达到了保留片段在堆栈中的状态的目的,方法是将该片段的所有详细信息传递给主活动,然后再将其添加到堆栈中,并将该状态保存到主活动的saveInstance状态中,并且只要堆栈发生变化且上一个片段可见时,我正在从主要活动中将该片段的已保存实例状态传递给它,因此我保留了该状态。 我不确定这是否正确。

我已经了解了您的情况。 基本上,当您在片段的saveedinstanceState中添加arraylist时,您做的不错,但是根据我的说法,您的活动没有犯任何错误。

当方向改变时,在这种情况下,如果您不检查片段是否已添加,Activity会先调用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中。

请在GitHub inpulse-fragment上找到此演示

在此演示的第一个片段中,当您增加计数器时,它将显示在上方的文本视图中,如果您单击该文本视图,将导航至片段B。现在您可以尝试旋转。 如有任何查询,请通知我。

您可以在onAttach使用setRetaininstance(true) ,并在活动清单文件中使用ConfigChanges = "screenSize|keyBoardHidden|orientation"这行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM