java.lang.IllegalStateException(onSaveInstanceState 后无法执行此操作)
Posted
技术标签:
【中文标题】java.lang.IllegalStateException(onSaveInstanceState 后无法执行此操作)【英文标题】:java.lang.IllegalStateException(Can not perform this action after onSaveInstanceState) 【发布时间】:2014-10-18 15:32:33 【问题描述】:我在不同情况下收到此错误并显示以下消息:
Activity 已被销毁并且 onSaveInstanceState 后无法执行此操作我正在编写一个应用程序,其中两个 Activity 相互交互。 Activity-A 使用 Intent 启动 Activity-B。这个 Activity-B 类有两个片段子级。 Fragment-A 使用公共活动方法来启动另一个 Fragment-B。
public void beginTransaction(ID id, Bundle bundle)
Fragment fragment = getFragmentItem(id);
// In case this activity was started with special instructions from an Intent,
// pass the Intent's extras to the fragment as arguments
fragment.setArguments(bundle);
// Add the fragment to the 'fragment_container' FrameLayout
fragmentManager.beginTransaction()
.add(R.id.fragment_container, fragment).commitAllowingStateLoss();
Fragment-B 每次调用 finish() 来杀死 Activity-B 从而控制再次回到 Activity-A。并重复相同的过程。做了 2-3 次后,我得到:
java.lang.IllegalStateException: 之后无法执行此操作 onSaveInstanceState E/AndroidRuntime(9008): 在 android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1354) E/AndroidRuntime(9008):在 android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1372)
所以为了避免它,我关注https://***.com/a/10261438/2624806,它开始给我
Java.lang.IllegalStateException: Activity 已被销毁 E/AndroidRuntime(9235):在 android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1376) E/AndroidRuntime(9235):在 android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)
我在这里缺少的任何建议。
明白了我得到了解决方案..这是在添加片段的事务中发生的错误。我使用 .add 而不是使用 .replace (因为我要求不维护堆栈)并使用 commitAllowTransaction 来提交它。我也阅读了http://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html,似乎我所做的可能代价高昂,但对于正常的片段事务,提及变通方法效果很好。
【问题讨论】:
commitAllowingStateLoss()
到 commit()
。
如何从片段中调用完成?使用 getActivity().finish()?
什么时候调用beginTransaction(...)方法? Fragment Transactions & Activity State Loss "避免在异步回调方法中执行事务。"
谢谢,@Mdlc @ anderson_acs 我没有写明确的代码来完成 Fragment,Fragment 调用公共方法 beginTransaction() 来启动另一个 Fragment,它替换现有的 Fragment。任何建议!
由于要删除 Fragment-A 并添加 Fragment-B,因此需要使用 FragmentTransaction.replace
而不是 FragmentTransaction.add
。尝试让我知道它是否有帮助。
【参考方案1】:
由于声誉点较低,我无法评论您的问题。 我认为这是您更改片段的公共方法。
public void beginTransaction(ID id, Bundle bundle)
每次您将片段添加到活动时,在此方法中。因此,如果您是第一次添加片段,这将正常工作,但在第二个片段的情况下,您应该使用替换而不是添加
fragmentManager.beginTransaction()
.replace(R.id.fragment_container, fragment).commitAllowingStateLoss();
我认为这样做后你不应该面对这个问题。或者您可以对第一个和第二个片段使用“替换”。 我希望这能帮到您。
【讨论】:
如果我的要求是我不能使用替换而不是添加,那么我该如何处理呢?以上是关于java.lang.IllegalStateException(onSaveInstanceState 后无法执行此操作)的主要内容,如果未能解决你的问题,请参考以下文章