[英]How to use saved instance state and restore instance state with spinners in in Android?
[英]android restore instance state of a fragment that is in backstack
嗨,我有一个活动,有两个片段。
片段B
现在的问题是,如果用户位于片段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.