gpt4 book ai didi

android - 弹出整个 FragmentManager BackStack 时未呈现初始 fragment

转载 作者:太空狗 更新时间:2023-10-29 13:53:32 26 4
gpt4 key购买 nike

实际问题/TL;DR:除非使用一种我认为是 hack 的方法,否则我无法通过在 onCreate() 期间添加的单个 fragment 弹出 Activity 的整个后台堆栈以返回到我的初始状态。 fragment 存在于 Activity State Manager 转储中,但不可见,给我留下了一个空白屏幕。

我今天遇到了这个问题,主要是想了解这是由错误引起的还是我对 FragmentManager 的 BackStack 的误解引起的。我想确保我没有滥用 Fragments 或在不稳定的 API 基础上构建。

我有一个 Activity ,它本质上提供了一个下降的“树”导航作为按钮网格,其中每个按钮打开一个子网格(例如,具有更多按钮的子类别)或一些自定义表单。表格的内容无关紧要,但希望用户按各种顺序重复填写。

我使用支持库 (support-v4:25.1.1) 中的 fragment ,每当需要新的“屏幕”(无论是表单还是子网格)时,都会使用 Activity 的 FragmentManager 上的事务添加它类似于:

/* adding a new screen, going further down our nav tree */
fragmentManager
.beginTransaction()
.addToBackStack("...")
.replace(R.id.container, newFragment)
.commit();

除了我的 Activity 的初始状态设置外,每个事务看起来都是这样,它添加了初始“根网格” fragment 而不将事务添加到后台状态。

/* adding the initial fragment during the first execution of activity's onCreate(). */
fragmentManager
.beginTransaction()
.replace(R.id.container, rootFragment)
.commit();

我在这里发帖的原因是我在尝试弹出整个 BackStack 时遇到了一个非常奇怪的行为,它应该让用户回到具有根网格的 Activity 的初始状态(添加的那个在上面的代码中)。几乎我尝试过的每一种技术都能有效地清除后台堆栈,但会留下一个空屏幕,而不是我最初的主菜单网格。在查看了此处的多个问题和文档后,我尝试了多种解决方案,但只有这个看起来像 hack 的解决方案有效:

int remainingEntries = fragmentManager.getBackStackEntryCount();
while (remainingEntries-- > 0) {
fragmentManager.popBackStackImmediate();
}

我说这似乎是一个 hack,因为它需要我立即(同步)弹出任意数量的 backstack 条目以到达根目录,而根据我的理解,应该可以这样做单个异步方法调用:

fragmentManager.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

或者正如我在这里看到的那样:

int id = fragmentManager.getBackStackEntryAt(0).getId();
fragmentManager.popBackStack(id, FragmentManager.POP_BACK_STACK_INCLUSIVE);

这只是根 fragment 的问题,可能是因为将它添加到 View 的事务没有添加到后台堆栈,因为这会导致在用户按下后退按钮关闭时显示额外的空白屏幕 Activity 。

更多详情:

  • 根据 Activity State Manager 转储,我的 fragment 仍然有它的 View ,但 mFragmentId 和 mContainerId 都设置为 #0。
  • 我确实添加了另一个我没有在这里讨论的 fragment ,它保留了它的实例,但它只用于保存一些数据并且没有任何 View 。

最佳答案

有一个PopBackStackImmediate bug在支持库版本 25.1.0 及更高版本中。由于已报告此问题,您必须等待解决方案,或者您可以将支持库版本降级到 25.0.1 并获得预期的行为。

更新

看起来此错误已在支持库版本 25.3.1 中得到解决。将您的库更新到版本 25.3.1。

关于android - 弹出整个 FragmentManager BackStack 时未呈现初始 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42566945/

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