这是导致问题的情况:

  • 我从一个ViewGroup开始Acitivity,该ViewGroup将保存呈现的片段。
  • 我通过在保存到Backstack中的事务中调用.replace()将片段A加载到此ViewGroup中。
  • 我将片段B加载到 View 组中,以替换片段A。再次,我保存了事务。
  • 我旋转设备两次。
  • 在第二次旋转时,片段A(目前不可见)将引发NullPointer异常。

  • 片段A抛出此异常,因为我将Views(例如EditTexts)的某些值保存在其onSaveInstanceState()方法中。似乎在第二次旋转时,系统没有实例化这些View,所以当我询问它们的值时,我得到了NullPointer异常。可以避免这种情况吗?还是在片段事务中使用.replace操作不建议将其保存到Backstack中?

    最佳答案

    我已经做到了,但是不能完全回忆起我所做的工作的细节,但是总的来说(以及对人才流失的道歉),我会执行以下操作:

  • 调用setRetainInstance(true)中的onCreate以避免碎片重新生成
  • 将 Activity 被杀死并且使用非空 bundle 包恢复时,应将编辑控件等的状态保存在onSaveInstanceState中,以便使用非空 bundle 包进行恢复(定向更改为1时,您不应该使用非空 bundle 包)。
  • 维护成员变量中的编辑控制值(因为将不重新创建片段),以确保它们从editt代码中通过编辑控件进行更新,然后使用它们在onDestroyView
  • 中恢复编辑控件值
  • 有一个标志,我在onCreateView中将其设置为true,在onCreateView中将其设置为false,并确保在 View 不存在时不触摸UI控件。

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

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

    08-18 08:53
    查看更多