我在不同的情况下收到以下消息时出现此错误:
我正在编写一个应用程序,其中两个Activity互相交互。 活动-A 使用Intent启动活动-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 每次调用结束()来杀死Activity-B,因此控件再次返回 Activity-A 。同样的过程重复。做了2-3次后,我得到了:
java.lang.IllegalStateException:之后无法执行此操作 onSaveInstanceState E / AndroidRuntime(9008): at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1354) E / AndroidRuntime(9008):at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1372)
所以为了避免它,我按照https://stackoverflow.com/a/10261438/2624806开始给我
Java.lang.IllegalStateException:活动已被销毁 E / AndroidRuntime(9235):at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1376) E / AndroidRuntime(9235):at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)
任何建议我在这里缺少的东西。
GOT IT 我得到了解决方案..在添加片段的事务中发生了错误。我使用 .add 代替使用 .replace (因为我要求不维护堆栈)并使用 commitAllowTransaction 提交它。我也阅读了http://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html,看起来我所做的事情可能代价高昂,但对于正常的片段交易,提到的解决方法很棒。
答案 0 :(得分:14)
由于声誉较低,我无法对您的问题发表评论。 我认为这是改变片段的公共方法。
public void beginTransaction(ID id, Bundle bundle)
每次将片段添加到活动时,都会使用此方法。因此,如果您是第一次添加片段,这将正常工作,但如果是第二个片段,您应该使用替换不添加
fragmentManager.beginTransaction()
.replace(R.id.fragment_container, fragment).commitAllowingStateLoss();
我认为这样做后你不应该面对这个问题。或者您可以使用&替换'对于第一和第二片段。 我希望这能帮到您。