在事务中替换片段时出现片段回退堆栈错误?

7

以下是导致问题的情景:

  1. 我启动一个Activity,其中包含一个用于显示Fragment的ViewGroup。
  2. 我通过在事务中调用.replace()方法将Fragment A加载到此ViewGroup中,并将该事务保存到后堆栈(backstack)中。
  3. 我将Fragment B加载到Viewgroup中,以替换Fragment A。再次,我保存了该事务。
  4. 我旋转设备两次。
  5. 在第二次旋转时,此时不可见的Fragment A将抛出NullPointer异常。

由于我在Fragment A的onSaveInstanceState()方法中保存了某些View(例如EditTexts)的值,所以会抛出此异常。似乎在第二次旋转时,系统没有实例化这些View,因此当我请求它们的值时,会出现NullPointer异常。是否有办法避免这种情况?或者说,在Fragment事务中使用.replace操作并保存到backstack中是否不建议?

1个回答

3
我曾经遇到过这种情况,但是我无法准确回忆起我做了什么来修复它。一般来说,我会执行以下操作(对于脑海中的淤积表示抱歉):
  1. onCreate中调用setRetainInstance(true)以避免片段重建。

  2. onSaveInstanceState中保存编辑控件等状态,以便在Activity被杀死并使用非空Bundle恢复时使用(如果使用1.,您不应该在方向更改时获得非空Bundle)。

  3. 在成员变量中维护编辑控件值(因为片段不会重新创建),确保在onDestroyView中从编辑控件中更新它们,然后在onCreateView中使用它们来还原编辑控件的值。

  4. 拥有一个标志,在onCreateView中将其设置为true,在onDestroyView中将其设置为false,并确保当视图不可见时不要触摸UI控件。

顺便说一句,使用replace将事务添加到后退栈中完全没问题。

希望这些内容对您有所帮助。Peter.

3
我注意到你接受了这个答案……最终有什么是有用的呢? - Robert Karl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接