5

对于我正在编写的当前应用程序,我实现了一个导航抽屉(具有向后兼容性的默认 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;
}

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

这是我的例外:“java.lang.IllegalStateException:onSaveInstanceState 后无法执行此操作”

它恰好发生在我做的地方

fragmentTransaction.commit();

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

4

1 回答 1

1

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

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

于 2013-11-15T10:17:30.520 回答