在替换 Fragment 的双重旋转后恢复 Fragment 时清空 savedInstanceState Bundle

alg*_*hms 5 android android-lifecycle android-fragments

让我们称它们为片段 A 和 B。片段 B 只是 A 的详细视图,单击片段 A 中的按钮即可替换片段 A。

替换代码:

    FragmentTransaction transaction = getFragmentManager().beginTransaction();
    transaction.replace(R.id.fragment_container, new DetailFragment());
    transaction.addToBackStack(null);
    transaction.commit();
Run Code Online (Sandbox Code Playgroud)

当我现在在 Fragment B 中旋转屏幕一次并按 Back 时,旧的 Fragment A 被恢复而没有任何问题(它在 onActivityCreated 中使用savedInstanceState Bundle 恢复它的状态)。

现在到有趣的部分......

当我在 Fragment B 中多次旋转屏幕并按 Back 时,我得到一个 NullPointerException,因为int[] data = savedInstanceState.getIntArray(STATE_DATA);inonActivityCreated返回 null。

我该如何解决这种行为?我想到的唯一另一种方法是通过永久存储(首选项或数据库),但这似乎非常不适合用例。

编辑/附加信息:包本身不为空,它只是空的

alg*_*hms 5

好吧,我找到了答案:

当片段 B 处于活动状态时,片段 A 中的以下方法会在旋转更改时被调用:onSaveInstanceState()、onAttach() 和 onCreate()

因为我正在 onActivityCreated 中恢复我的状态(这实际上是 sdk 推荐的!),我在第一次旋转后丢失了存储在包中的变量,因为它们永远不会加载到本地变量中,然后将存储在下一个 onSaveInstanceState 中。因此,当我尝试在第二次旋转后检索它们时,这些值为空。

解决方案:恢复onCreate()中的变量,以便再次调用onSaveInstanceState时可用。