对于我正在撰写的当前应用程序,我已经实现了导航抽屉(默认的Android方式具有向后兼容性)。 所以从导航器中你选择一个菜单元素,然后我这样做(addPreviousToBackStack总是假的,用于测试):
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();
我不知道为什么我在重新打开应用程序时获得此功能,而不是在应用程序最初打开时。任何线索??
答案 0 :(得分:0)
我不确定您的用例的上下文是什么,但调用fragmentTransaction.commitAllowStateLoss();
不应该导致崩溃。但是,您需要承担您的状态信息将在片段上丢失的风险。
此外,这条线currentFragment = fragment;
在我看来是内存泄漏的原因。如果Android想要清理片段,您将通过保留对片段的强引用来阻止它。不要使用它......