首页 文章

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

提问于
浏览
3

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

  • 活动已被破坏

  • 在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();
    }

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:活动已被销毁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,看起来我所做的事情可能代价高昂,但对于正常的片段交易,提及解决方案的工作很棒 .

1 回答

  • 14

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

    public void beginTransaction(ID id, Bundle bundle)
    

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

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

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

相关问题