【问题标题】:Fragment backstack bug when replacing fragments in a transaction?替换事务中的片段时出现片段回栈错误?
【发布时间】:2011-11-24 17:02:42
【问题描述】:

这是导致问题的场景:

  1. 我使用 ViewGroup 启动一个 Acitivity,该 ViewGroup 将保存呈现的片段。
  2. 我通过在保存到后台堆栈的事务中调用 .replace() 将 Fragment A 加载到此 ViewGroup 中。
  3. 我将 Fragment B 加载到 Viewgroup 中,替换 Fragment A。我再次保存事务。
  4. 我旋转了设备两次。
  5. 在第二次旋转时,片段 A(目前不可见)将引发 NullPointer 异常。

这个异常是由 Fragment A 引发的,因为我在其 onSaveInstanceState() 方法中保存了一些视图值(例如 EditTexts)。看来,在第二次轮换时,系统没有实例化这些视图,所以当我询问它们的值时,我得到了 NullPointer 异常。可以以某种方式避免这种情况吗?还是在不建议的情况下在保存到后台堆栈的片段事务中使用 .replace 操作?

【问题讨论】:

    标签: android android-fragments


    【解决方案1】:

    我遇到过这种情况,但不太记得我做了什么来修复的细节,但总的来说(并为大脑转储道歉)我会做以下事情:

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

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

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

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

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

    希望其中有一些帮助。彼得。

    【讨论】:

    • 我注意到您接受了这个答案......最终有什么用处?
    猜你喜欢
    • 1970-01-01
    • 2019-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多