重新打开并替换片段时 Android 应用程序崩溃

dir*_*ert 5 java android fragment android-fragments

对于我当前正在编写的应用程序,我已经实现了一个导航抽屉(具有向后兼容性的默认 Android 方式)。因此,从导航抽屉中选择一个菜单元素,然后我执行此操作(对于测试,addPreviousToBackStack 始终为 false):

private void replaceFragment(final Fragment fragment, final boolean addPreviousToBackStack) {
    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.replace(R.id.activity_main_fragment_container, fragment);
    if(addPreviousToBackStack) {
        fragmentTransaction.addToBackStack(fragment.getTag());
    }
    fragmentTransaction.commit();
    currentFragment = fragment;
}
Run Code Online (Sandbox Code Playgroud)

所以当我启动应用程序时,这就像一个魅力。然后我使用后退按钮关闭应用程序。如果我随后重新打开应用程序(无论如何:通过长按主页按钮或通过快捷方式),应用程序将从初始屏幕启动(调用 onCreate),然后打开导航抽屉并选择一个菜单项,应用程序崩溃。

这是我的异常:“java.lang.IllegalStateException:无法在 onSaveInstanceState 之后执行此操作”

它恰好发生在我所做的事情上

fragmentTransaction.commit();
Run Code Online (Sandbox Code Playgroud)

我不知道为什么在重新打开应用程序时而不是在最初打开应用程序时收到此消息。有什么线索吗??

gun*_*nar 1

我不确定您的用例的上下文是什么,但调用fragmentTransaction.commitAllowStateLoss();不应再导致崩溃。但是,您需要承担状态信息在片段中丢失的风险。

另外,currentFragment = fragment;在我看来,这条线似乎是内存泄漏的原因。如果 Android 想要清理该片段,您可以通过保留对该片段的强引用来阻止它。不要使用它...