【发布时间】:2017-06-08 16:51:20
【问题描述】:
我正在学习如何实现“单个活动 - 多个片段”架构。据我了解,这是当今广泛使用的方法,您可以找到很多关于此主题的文章。例如这个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: Can not perform this action after onSaveInstanceState
已经在 StackOverflow 上提出了很多关于这个问题的问题,但我没有找到适合我的案例的正确答案。人们建议致电commitAllowingStateLoss() 等等,但这与我的情况无关。我不想开始新的片段,我只想回到上一个片段。
所以我的问题如下:我的理解是否正确,即在屏幕配置更改后无法通过返回堆栈导航回来?您所要做的就是使其无效并从头开始?
【问题讨论】:
标签: android android-fragments fragment-backstack