我正在学习如何实现“单一活动 - 多片段”架构。根据我的理解,现在这种方法很普遍,你可以找到很多关于这个主题的文章。例如这一个http://vinsol.com/blog/2014/09/15/advocating-fragment-oriented-applications-in-android/。
在这种架构中有两种类型的片段 - 从我的角度来看父母和孩子。
父片段从顶层开始,例如从抽屉开始。我更喜欢以下列方式进行:
public void startParent(Fragment fragment) {
manager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.fragment_container, fragment);
transaction.addToBackStack(fragment.getClass().getCanonicalName());
transaction.commit();
}
此外,还有像这样启动的子片段:
public void startChild(Fragment fragment) {
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.fragment_container, fragment);
transaction.addToBackStack(fragment.getClass().getCanonicalName());
transaction.commit();
}
在这两种情况下,manager
都是由活动提供的标准片段管理器。
提供的方法之间只有一个区别。在第一种情况下,后备栈被清除以从头开始新的片段。在第二秒,它只是推到后面的堆栈。
因此,后台堆栈可能如下所示: 家长 - > Child1 - >的child2
用户在片段之间导航或只从顶层(抽屉)开始新序列。
当用户按下后退按钮时,最后一个片段将从堆栈中弹回。据我了解,您甚至不需要覆盖onBackPressed()
活动方法。
在更改屏幕配置之前,它可以正常工作。更改屏幕配置时onBackPressed()
会导致众所周知的错误 java.lang.IllegalStateException:onSaveInstanceState后无法执行此操作
在StackOverflow上已经有很多关于这个问题的问题,但我没有找到适合我案例的正确答案。人们建议拨打commitAllowingStateLoss()
等等,但这与我的情况无关。我不想开始新的片段我只想回到上一个片段。
所以我的问题是:我的理解是正确的,在屏幕配置更改后无法通过后台堆栈导航回来吗?你所要做的就是使它无效并从头开始?
答案 0 :(得分:1)
当您尝试在片段活动的 onSaveInstanceState()被调用后执行片段转换时会发生这种异常。
更改配置后,系统将回收资源的活动并在以后重新创建,这就是为什么片段不会创建并显示 java.lang.IllegalStateException 异常的原因。
参考: - getting exception "IllegalStateException: Can not perform this action after onSaveInstanceState"