在交易中替换碎片时的碎片堆栈错误?

以下是导致问题的场景:

  • 我用一个ViewGroup启动一个Acitivity,它将保存所呈现的片段。
  • 我通过在保存到后台堆栈的事务中调用.replace()将片段A加载到此ViewGroup中。
  • 我将Fragment B加载到Viewgroup中,替换了Fragment A.再次保存事务。
  • 我旋转设备两次。
  • 在第二轮中,片段A(此时不可见)将抛出NullPointer异常。
  • 这个异常由Fragment A引发,因为我在其onSaveInstanceState()方法中保存了一些Views的值(EditTexts eg)。 看起来,在第二次轮换时,系统并没有实例化这些视图,所以当我询问它们的值时,我得到一个NullPointer异常。 这可以以某种方式避免吗? 或者正在使用.replace操作保存到堆栈中的片段传输未被修改?


    我有这个,但不能完全回忆我所做的修复的具体细节,但总的来说(和大脑转储的道歉),我做了以下工作:

  • onCreate调用setRetainInstance(true)以避免片段重新创建

  • 将编辑控件的状态保存在onSaveInstanceState ,以便在活动被onSaveInstanceState时使用,并且您使用非空的包进行恢复(对于使用1的方向更改,您不应得到非空包)

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

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

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

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

    链接地址: http://www.djcxy.com/p/10061.html

    上一篇: Fragment backstack bug when replacing fragments in a transaction?

    下一篇: jQuery UI Slider with control buttons?