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

5
我在不同场景下遇到以下错误信息:
  • Activity已被销毁
  • 无法在onSaveInstanceState后执行此操作
我正在编写一个应用程序,其中两个Activity相互交互。 Activity-A 使用Intent启动 Activity-B。这个 Activity-B 类有两个Fragment子类。 Fragment-A 使用Activity的公共方法来启动另一个 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,控制会回到 Activity-A。同样的过程会重复进行。做了2-3次后,我得到了以下错误信息:java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState E/AndroidRuntime( 9008):,为了避免这种情况,我遵循 https://dev59.com/qms05IYBdhLWcg3wD90B#10261438,但是现在出现了Java.lang.IllegalStateException: Activity has been destroyed。请问我错过了什么吗?

明白了 我找到了解决方案...在添加片段的事务中出现了错误。我使用了.add而不是使用.replace(因为我的要求不需要维护堆栈),并使用commitAllowTransaction进行提交。我也阅读了http://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html,看起来我所做的可能会很昂贵,但对于普通片段事务,提供的解决方法非常好用。


1
commitAllowingStateLoss()commit() - Simas
你是如何从片段中调用finish的?使用getActivity().finish()吗? - Mdlc
谢谢,@Mdlc @anderson_acs。我没有编写显式代码来完成Fragment,Fragment调用公共方法beginTransaction()来启动另一个替换现有Fragment的Fragment。有什么建议! - CoDe
1
由于您想要删除 Fragment-A 并添加 Fragment-B,所以需要使用 FragmentTransaction.replace 而不是 FragmentTransaction.add。请尝试并让我知道是否有帮助。 - Manish Mulimani
@Shubh,你能否发布调用finish的完整代码? - Rod_Algonquin
显示剩余2条评论
1个回答

17

由于我的声望不够高,无法在您的问题中进行评论。 我认为这是您公开修改片段的方法。

public void beginTransaction(ID id, Bundle bundle)

在这种方法中,每次你向活动添加片段。因此,如果你第一次添加片段,它会正常工作,但是在第二个片段的情况下,你应该使用替换而不是添加。

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

我认为在这样做之后,你不应该再遇到这个问题。或者你可以对第一个和第二个片段都使用'replace'方法。 希望这能帮到你。


1
如果我的需求是不能使用替换而只能添加,那么我该如何处理? - Ready Android

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接