java 安卓还原处于backstack中的片段的实例状态
嗨,我有一个活动有两个片段
- 片段A
片段B
- 片段A有一个EditText和一个ListView李>
- 在EditText中输入内容并点击enter键后,我将填充ListView李>
- 现在片段A的ListView中填充了数据李>
- 单击片段A的列表视图上的任何项目都会将用户发送到片段B
- 此时,我将用片段B替换片段A
- 因此,当用户点击后退按钮时,他返回到片段A
现在的问题是,如果用户在片段B中,并且配置更改多次发生,如屏幕旋转等,那么我的列表视图是空的,因为我的arraylist是空的
注意,我在片段A和片段B中使用onSavedInstanceState。 如果我当前的片段是片段A,并且发生了配置更改,那么恢复状态就没有问题,因为在onCreateView中,我从bundle获取arraylist
当我从片段B返回到之前处于backback中的片段A时,我知道为什么我的arraylist为null。当片段A处于backstack时,唯一被调用的方法是onSaveInstanceState,因此在第一次配置更改后,我的arraylist字段为null,因为我无法将存储在SavedInstanceState捆绑包中的arraylist分配给arraylist字段
我不想在清单中使用安卓:configchanges属性
我的问题是如何恢复处于backback状态的片段的状态
# 1 楼答案
您可以在
onAttach
中使用setRetaininstance(true)
和这一行ConfigChanges = "screenSize|keyBoardHidden|orientation"
在活动清单文件中# 2 楼答案
我通过在添加到backstack之前将片段的所有细节传递给主活动,并以主活动的savedInstance状态保存该状态,实现了保留backstack中片段的状态的目标,并且每当backstack发生变化且之前的片段可见时,我都会传递该片段的已保存实例状态从主要活动中分离出来,这样我就保留了状态。我不确定这是否是正确的方法
# 3 楼答案
我已经看过你的剧本了。 当你在片段的savedinstanceState中添加arraylist时,基本上你做的是正确的,但根据我的说法,你在你的活动中没有犯什么错误
当方向发生变化时,调用onDestroy,然后在该场景中再次创建,如果您没有检查片段是否已添加,那么它将用新片段替换它。 以下是您应该输入onCreate()的代码
另一点是,当您希望保留第一个片段时
在片段的一次创造中
请在GitHub上找到此演示 inpulse-fragment
在这个演示中,当你增加计数器时,它会出现在上面的文本视图中,如果你点击该文本视图,你将导航到片段B。现在你可以尝试旋转。 如果有任何疑问,请告诉我