在事务中替换片段时会出现片段后端错误?

时间:2011-11-24 17:02:42

标签: android android-fragments

以下是导致问题的方案:

  1. 我使用ViewGroup启动一个Acitivity,它将保存显示的片段。
  2. 我通过在保存到backstack上的事务中调用.replace()将Fragment A加载到此ViewGroup中。
  3. 我将片段B加载到Viewgroup中,替换片段A.再次,我保存了事务。
  4. 我将设备旋转两次。
  5. 在第二次旋转时,片段A(此时不可见)将抛出NullPointer异常。
  6. Fragment A引发了这个异常,因为我在onSaveInstanceState()方法中保存了一些Views(EditTexts eg)值。看来,在第二次旋转时,系统不会实例化这些视图,所以当我询问它们的值时,我会得到一个NullPointer异常。这可以以某种方式避免吗?或者是在片段转换中使用.replace操作保存在backstack上?未经修改?

1 个答案:

答案 0 :(得分:3)

我已经有了这个,但是不能完全回忆起我所做的修复细节,但一般来说(并为大脑转储道歉)我做了以下事情:

  1. setRetainInstance(true)中调用onCreate以避免片段重新播放

  2. 保存onSaveInstanceState中编辑控件等的状态,以便在活动被终止时使用,并使用非null包恢复(您不应该获取非空包方向改变为1。)

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

  4. 有一个标记,我在onCreateView中设置为true,在onDestroyView设置为false,并确保在视图不在时触摸UI控件。

  5. BTW在将事务添加到后台堆栈时使用replace完全可以。

    希望那里有一些有用的东西。彼得。