java.lang.IllegalStateException(在onSaveInstanceState之后无法执行此操作) [英] java.lang.IllegalStateException(Can not perform this action after onSaveInstanceState)

查看:135
本文介绍了java.lang.IllegalStateException(在onSaveInstanceState之后无法执行此操作)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在不同情况下,我会收到以下消息,提示此错误:

I am getting this error with following message in different scenario:

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

我正在编写一个应用程序,其中两个活动相互交互. Activity-A 使用Intent启动 Activity-B .此 Activity-B 类具有两个片段子级. Fragment-A 使用公开的活动方法启动另一个 Fragment-B .

I am writing an app where Two Activity interacting with each Other. Activity-A launch Activity-B using Intent. This Activity-B class have two fragment children. Fragment-A use public method of activity to launch another 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();
    }

每次调用 finish()杀死 Activity-B

Fragment-B ,因此控制权再次移回 Activity-A .并重复相同的过程.经过2-3次后,我得到:

Fragment-B every time call finish() to kill Activity-B hence control move back to Activity-A again. And same process repeat. After doing 2-3 time I am getting:

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)

java.lang.IllegalStateException: Can not perform this action after 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 ,它开始给我

so to avoid it I follow https://stackoverflow.com/a/10261438/2624806 and it started to give me

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)

Java.lang.IllegalStateException: Activity has been destroyed 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)

任何建议,我在这里缺少什么.

any suggestion what I am missing here.

知道了.我得到了解决方案..它是由于添加片段而在交易中发生的错误.我使用的是 .add ,而不是使用 .replace (因为我的要求是不维护堆栈),并使用 commitAllowTransaction 来提交它.我阅读了 http://www.androiddesignpatterns.com/同样是2013/08/fragment-transaction-commit-state-loss.html ,似乎我的操作可能会花很多钱,但对于正常的碎片交易而言,解决方法的工作很棒.

GOT IT I got solution ..it is mistake happening in transaction for adding fragment. I was using .add instead to use .replace (as my requirement not to maintain stack) and use commitAllowTransaction to commit it. I read http://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html as well and seems what I did could be costly but for normal fragment transaction mention work-around work great.

推荐答案

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

As i can not comment on your question due to less reputation point. I assume this is your public method to change fragment.

public void beginTransaction(ID id, Bundle bundle)

在这种方法中,每次将片段添加到活动中时.因此,如果您是第一次添加片段,则可以正常工作,但如果是第二个片段,则应使用replace not add

In this method every time you are adding fragment to activity. So if you are adding fragment first time this will work fine but in case of second fragment you should use replace not add

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

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

I think after doing this you should not face this problem. or you can use 'replace' for both first and second fragment. I hope this will help you.

这篇关于java.lang.IllegalStateException(在onSaveInstanceState之后无法执行此操作)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆