【问题标题】:Fragment oriented architecture and the back stack面向片段的架构和后栈
【发布时间】: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


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的参考,但我已经阅读了。它没有回答我的问题。我没有在 Activity 生命周期方法中提交事务。另外,我不愿意将空的onSaveInstanceState 方法放入我的活动中。问题是没有popBackStackAllowingStateLoss 方法。
    猜你喜欢
    • 2012-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-26
    • 2016-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多