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

Zso*_*agy 7 android android-fragments

这是导致问题的场景:

  1. 我用ViewGroup启动一个Acitivity,它将保存呈现的片段.
  2. 我通过在保存到backstack上的事务中调用.replace()将Fragment A加载到此ViewGroup中.
  3. 我将片段B加载到Viewgroup中,替换片段A.再次,我保存了事务.
  4. 我将设备旋转两次.
  5. 在第二次旋转时,片段A(此时不可见)将抛出NullPointer异常.

片段A抛出此异常,因为我在其onSaveInstanceState()方法中保存了一些视图值(例如EditTexts).看来,在第二次旋转时,系统不会实例化这些视图,所以当我询问它们的值时,我会得到一个NullPointer异常.这可以以某种方式避免吗?或者是在片段交易中使用.replace操作保存在backstack上?

PJL*_*PJL 3

我已经遇到过这个问题,但不太记得我所做的修复的具体细节,但一般来说(并对大脑转储表示歉意)我会执行以下操作:

  1. 致电以避免片段重新setRetainInstance(true)创建onCreate

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

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

  4. 有一个标志,我将其设置为 trueonCreateView和 false onDestroyView,并确保当视图不在周围时我不会触摸 UI 控件。

replace顺便说一句,在将事务添加到后台堆栈时使用是完全可以的。

希望里面有什么可以帮助的。彼得.

  • 我注意到您接受了这个答案...最终有用的是什么? (3认同)