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

时间:2014-09-18 09:40:57

标签: android android-fragments android-lifecycle

让它们称为片段A和B.片段B只是A的详细视图,它在片段A中单击按钮时替换片段A.

替换代码:

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

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

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

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

如何解决此问题?我唯一的另一种方式是通过永久存储(Preference或DB),但这似乎非常不适合用例。

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

1 个答案:

答案 0 :(得分:3)

好的,我找到了答案:

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

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

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