gpt4 book ai didi

android - 面向 fragment 的架构和后台堆栈

转载 作者:行者123 更新时间:2023-11-29 01:09:18 29 4
gpt4 key购买 nike

我正在学习如何实现“单一 Activity - 多个 fragment ”架构。据我所知,这是如今很普遍的方法,你可以找到很多关于这个主题的文章。例如这个 http://vinsol.com/blog/2014/09/15/advocating-fragment-oriented-applications-in-android/ .

在我看来,这种架构中有两种类型的 fragment - 父 fragment 和子 fragment 。

父 fragment 从顶层开始,例如从抽屉开始。我更喜欢按以下方式进行:

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();
}

此外,还有一个子 fragment 是这样启动的:

public void startChild(Fragment fragment) {
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.fragment_container, fragment);
transaction.addToBackStack(fragment.getClass().getCanonicalName());
transaction.commit();
}

在这两种情况下,管理器 都是 Activity 提供的标准 fragment 管理器。提供的方法之间只有一个区别。在第一种情况下,返回堆栈被清除以从头开始新的 fragment 。在第二个,它只是推到后面的堆栈。

因此返回堆栈可能如下所示:父级 -> 子级 1 -> 子级 2

用户在 fragment 之间导航或只是从顶层(抽屉)开始新序列。

当用户按下后退按钮时,最后一个 fragment 将从堆栈中弹出。据我了解,您甚至不需要重写 onBackPressed() Activity 方法。

在更改屏幕配置之前,它工作正常。当屏幕配置更改时 onBackPressed() 导致众所周知的错误 java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState

在 StackOverflow 上已经有很多关于这个问题的问题,但我没有找到适合我的案例的正确答案。人们建议调用 commitAllowingStateLoss() 等等,但这与我的情况无关。我不想开始新 fragment 我只想回到上一个 fragment 。

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

最佳答案

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

更改配置后,系统会回收资源的 Activity 并在稍后重新创建它,这就是为什么 fragment 不会创建并显示 java.lang.IllegalStateException 异常的原因。

引用:- getting exception "IllegalStateException: Can not perform this action after onSaveInstanceState"

关于android - 面向 fragment 的架构和后台堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44441508/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com