【发布时间】: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://stackoverflow.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。尝试让我知道它是否有帮助。
标签: android android-fragments illegalstateexception fragmentmanager