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

CoD*_*oDe 3 android illegalstateexception android-fragments fragmentmanager

我在不同场景中收到以下消息时出现此错误:

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

我正在编写一个应用程序,其中两个活动互相交互.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();
    }
Run Code Online (Sandbox Code Playgroud)

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)

所以为了避免它,我按照/sf/answers/718300691/开始给我

Java.lang.IllegalStateException:活动已被销毁 E/AndroidRuntime(9235):在android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1376)E/AndroidRuntime(9235):在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,看起来我所做的事情可能代价高昂,但对于正常的片段交易,提及解决方案的工作很棒.

Sub*_*ham 14

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

public void beginTransaction(ID id, Bundle bundle)
Run Code Online (Sandbox Code Playgroud)

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

    fragmentManager.beginTransaction()
    .replace(R.id.fragment_container, fragment).commitAllowingStateLoss();
Run Code Online (Sandbox Code Playgroud)

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