在替换 Fragment 的双轮换后恢复 Fragment 时清空 savedInstanceState Bundle

Posted

技术标签:

【中文标题】在替换 Fragment 的双轮换后恢复 Fragment 时清空 savedInstanceState Bundle【英文标题】:Empty savedInstanceState Bundle when restoring a Fragment after double Rotation in replacing Fragment 【发布时间】:2014-11-12 14:12:58 【问题描述】:

我们称它们为 Fragment A 和 B。Fragment B 只是 A 的详细视图,它会在单击 Fragment A 中的按钮时替换 Fragment A。

替换代码:

    FragmentTransaction transaction = getFragmentManager().beginTransaction();
    transaction.replace(R.id.fragment_container, new DetailFragment());
    transaction.addToBackStack(null);
    transaction.commit();

当我现在在 Fragment B 中旋转一次屏幕并按下 Back 时,旧的 Fragment A 会毫无问题地恢复(它会使用 savedInstanceState Bundle 在 onActivityCreated 中恢复它的状态)。

现在进入有趣的部分......

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

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

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

【问题讨论】:

【参考方案1】:

好的,我找到了答案:

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

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

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

【讨论】:

以上是关于在替换 Fragment 的双轮换后恢复 Fragment 时清空 savedInstanceState Bundle的主要内容,如果未能解决你的问题,请参考以下文章

Android基础:Fragment

底部导航片段中的 Viewpager2

Fragment基础操作

android多个fragment返回键层层返回

ViewPager+Fragment取消预加载(延迟加载)(转)

Fragment中无法选择GridView项