面向片段的体系结构和后端堆栈

时间:2017-06-08 16:51:20

标签: android android-fragments fragment-backstack

我正在学习如何实现“单一活动 - 多片段”架构。根据我的理解,现在这种方法很普遍,你可以找到很多关于这个主题的文章。例如这一个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()等等,但这与我的情况无关。我不想开始新的片段我只想回到上一个片段。

所以我的问题是:我的理解是正确的,在屏幕配置更改后无法通过后台堆栈导航回来吗?你所要做的就是使它无效并从头开始?

1 个答案:

答案 0 :(得分:1)

当您尝试在片段活动的 onSaveInstanceState()被调用后执行片段转换时会发生这种异常。

更改配置后,系统将回收资源的活动并在以后重新创建,这就是为什么片段不会创建并显示 java.lang.IllegalStateException 异常的原因。

参考: - getting exception "IllegalStateException: Can not perform this action after onSaveInstanceState"