我的Android应用程序管理多个片段。但是,我在现场看到大量崩溃,其中包含以下日志行:
java.lang.IllegalStateException: 失败保存状态: 活动 XxxFragment{81e598 id=0x7f0b0069 tag_yyy} 已清除索引: -1
在堆栈溢出中搜索答案是徒劳的;我似乎有很多同伴想知道这个例外到底意味着什么。深入研究异常跟踪和 Android 源,我可以看到异常来自我的主要活动保存其状态的点(FragmentActivity.onSaveInstanceState),并且各个片段正在写入包裹。每个片段都有一个索引(称为mIndex),它必须是非负的,但从代码中并不清楚为什么必须如此,因为mIndex永远不会在该函数中再次使用。
我不知道碎片是如何进入这种状态的,或者我能做些什么。我无法在自己的测试环境中重现该错误。任何人都可以阐明如何避免和/或处理此异常吗?
相关问题:
java.lang.IllegalState异常:失败保存状态:活动已清除片段中的索引
活动片段已清除索引:-1是什么意思,我该如何修复它?
将异常作为失败保存状态:活动片段已清除索引:-1,当我按下Android设备的主页按钮时
IllegalStateException with Android Fragments
编辑我之前的评论并使其成为实际答案。 setRetainInstance(true)
是一条红鲱鱼。至少就我而言。从这里开始: http://www.localwisdom.com/blog/2013/03/android-error-java-lang-illegalstateexception-failure-saving-state-active-fragmentname/
"您很可能尝试执行片段事务,而您没有引用片段的正确实例"
当我读到这一切对我来说都很有意义时。我用碎片做了两件错误的事情。
- 我的冒犯片段是单例。(主要禁忌)
- 我试图跨活动使用这些相同的片段实例,但没有正确保存状态。(这可以通过这里提到的方法实现:https://stackoverflow.com/a/12465343/333525)
(希望这有帮助。太长了,只能发表评论。
就我而言,我忘了检查是否fragment
是在分离和附加它之前添加的:
if (fragment != null && fragment.isAdded()) {
getSupportFragmentManager()
.beginTransaction()
.detach(fragment)
.attach(fragment)
.commit();
}