java.lang.IllegalStateException(在onSaveInstanceState之后无法执行此操作)

时间:2014-08-25 13:06:05

标签: android android-fragments illegalstateexception fragmentmanager

我在不同的情况下收到以下消息时出现此错误:

  • 活动已被破坏且
  • onSaveInstanceState
  • 后无法执行此操作

我正在编写一个应用程序,其中两个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,看起来我所做的事情可能代价高昂,但对于正常的片段交易,提到的解决方法很棒。

1 个答案:

答案 0 :(得分:14)

由于声誉较低,我无法对您的问题发表评论。  我认为这是改变片段的公共方法。

public void beginTransaction(ID id, Bundle bundle)

每次将片段添加到活动时,都会使用此方法。因此,如果您是第一次添加片段,这将正常工作,但如果是第二个片段,您应该使用替换不添加

    fragmentManager.beginTransaction()
    .replace(R.id.fragment_container, fragment).commitAllowingStateLoss();

我认为这样做后你不应该面对这个问题。或者您可以使用&替换'对于第一和第二片段。 我希望这能帮到您。