2011-11-24 88 views
7

下面是导致问题的情景:在交易中替换碎片时的碎片堆栈错误?

  1. 我开始一个胡亚蓉与将保持呈现一个片段的ViewGroup。
  2. 我通过在保存到堆栈的事务中调用.replace()将片段A加载到此ViewGroup中。
  3. 我将Fragment B加载到Viewgroup中,替换Fragment A.再次保存事务。
  4. 我旋转设备两次。
  5. 在第二次轮换时,Fragment A(此时不可见)将抛出一个NullPointer异常。

这个异常是由Fragment A引发的,因为我在其onSaveInstanceState()方法中保存了Views(EditTexts例如)的一些值。看起来,在第二次轮换时,系统并没有实例化这些视图,所以当我询问它们的值时,我得到一个NullPointer异常。这可以以某种方式避免吗?或者正在使用.replace操作保存到堆栈中的片段传输未被修改?

回答

3

我有这个,但不能完全记得我所做的修正,但总体来说(对大脑转储和道歉)具体我做到以下几点:在onCreate

  1. 呼叫setRetainInstance(true)以避免片段娱乐

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

  3. 保持成员变量的编辑控制值(该片段是不会重新创建)确保他们得到了onDestroyView从编辑控件更新,然后用它们在onCreateView

  4. 必须还原编辑控制值一个标志,我在onCreateView中设置为true,在onDestroyView中为false,并确保在视图不在时不触摸UI控件。

BTW使用replace同时增加交易到后面堆栈是完全确定。

希望在那里有东西有帮助。彼得。

+3

我注意到你接受了这个答案......最终有用的是什么? –