处理和缓解IllegalStateException(“故障保存状态:活动$ Fragment已清除索引:-1”)

我的Android应用程序管理多个片段。 我看到该字段中存在大量崩溃,但是包含此日志行:

java.lang.IllegalStateException:失败保存状态:active XxxFragment {81e598 id = 0x7f0b0069 tag_yyy}已清除索引:-1

在Stack Overflow中搜索答案毫无结果; 我似乎有很多公司想知道这个例外究竟意味着什么。 深入研究exception跟踪和Android源代码,我可以看到exception来自我的主Activity保存其状态(FragmentActivity.onSaveInstanceState),并且各个Fragments正被写入Parcelable。 每个Fragment都有一个索引(称为mIndex),它必须是非负的,但是从代码中可以清楚地知道为什么必须是这种情况,因为mIndex永远不会在该函数中再次使用。

我不知道片段是如何进入这种状态的,或者我能做些什么。 我无法在自己的测试环境中重现错误。 任何人都可以阐明如何避免和/或处理此exception?

相关的SO问题:

java.lang.IllegalStateException:失败保存状态:active已清除片段中的索引

活动片段清除了什么索引:-1表示我该如何解决?

获取exception作为失败保存状态:当我按下Android设备的主页按钮时,活动片段已清除索引:-1

Android片段的IllegalStateException

我将编辑我以前的评论,并将其作为一个真正的答案。 setRetainInstance(true)是一只红鲱鱼。 至少在我的情况下。 从这里开始: http : //www.localwisdom.com/blog/2013/03/android-error-java-lang-illegalstateexception-failure-saving-state-active-fragmentname/

“你很可能尝试执行片段事务,而你没有引用正确的片段实例”

当我读到这一切对我来说都是有意义的。 我用片段做了两件错事

  1. 我的违规片段是单身人士。 (少校禁忌)
  2. 我试图在没有正确保存状态的情况下在活动中使用这些相同的片段实例。 (这可以通过这里提到的方法来实现: https : //stackoverflow.com/a/12465343/333525 )

(希望这会有所帮助。仅仅发表评论太久了。)

在我的情况下,我忘了检查是否在分离和附加之前添加了fragment

 if (fragment != null && fragment.isAdded()) { getSupportFragmentManager() .beginTransaction() .detach(fragment) .attach(fragment) .commit(); }