Android 弹出整个FragmentManager BackStack时未呈现初始片段

Android 弹出整个FragmentManager BackStack时未呈现初始片段,android,android-fragments,fragment-backstack,Android,Android Fragments,Fragment Backstack,实际问题/TL;DR:除了使用一种方式,我考虑黑客,我不能弹出活动的整个堆栈返回到我的初始状态,在OnCeCube()中添加了一个单独的片段。该片段出现在活动状态管理器转储中,但不可见,给我留下了一个空屏幕 我今天遇到了这个问题,主要是想弄清楚这是由bug引起的,还是由于我对FragmentManager的后台工作的误解造成的。我想确保我没有滥用片段或在不稳定的API基础上构建 我有一个活动,它本质上提供了一个向下的“树”导航,作为一个按钮网格,其中每个按钮打开一个子网格(例如,带有更多按钮的子

实际问题/TL;DR:除了使用一种方式,我考虑黑客,我不能弹出活动的整个堆栈返回到我的初始状态,在OnCeCube()中添加了一个单独的片段。该片段出现在活动状态管理器转储中,但不可见,给我留下了一个空屏幕

我今天遇到了这个问题,主要是想弄清楚这是由bug引起的,还是由于我对FragmentManager的后台工作的误解造成的。我想确保我没有滥用片段或在不稳定的API基础上构建

我有一个活动,它本质上提供了一个向下的“树”导航,作为一个按钮网格,其中每个按钮打开一个子网格(例如,带有更多按钮的子类别)或一些自定义表单。表单的内容是不相关的,但是用户需要按照不同的顺序重复填写表单

我使用支持库(support-v4:25.1.1)中的片段,每当需要新的“屏幕”(表格或子网格)时,都会使用活动的FragmentManager上的事务添加它,类似于:

/* adding a new screen, going further down our nav tree */
fragmentManager
            .beginTransaction()
            .addToBackStack("...")
            .replace(R.id.container, newFragment)
            .commit();
除了设置我的活动的初始状态外,每个事务看起来都是这样的,它添加了初始的“根网格”片段,而没有将事务添加到后台状态

/* adding the initial fragment during the first execution of activity's onCreate(). */
fragmentManager
            .beginTransaction()
            .replace(R.id.container, rootFragment)
            .commit();
我在这里发帖的原因是,我在尝试弹出整个backbackback时遇到了一个非常奇怪的行为,这应该会让用户回到具有根网格(上面代码中添加的网格)的活动的初始状态。几乎我尝试的每一种技术都有效地清除了后台,但留下了一个空屏幕,而不是我最初的主菜单网格。在查看了这里的多个问题和文档后,我尝试了多种解决方案,只有这种看起来像黑客的解决方案有效:

int remainingEntries = fragmentManager.getBackStackEntryCount();
while (remainingEntries-- > 0) {
    fragmentManager.popBackStackImmediate();
}
我说这似乎是一种黑客行为,因为它要求我立即(同步)弹出任意数量的backbackback条目以到达根目录,而据我所知,通过一个异步方法调用就可以做到这一点:

fragmentManager.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
或者正如我在这里看到的:

int id = fragmentManager.getBackStackEntryAt(0).getId();
fragmentManager.popBackStack(id, FragmentManager.POP_BACK_STACK_INCLUSIVE);
这只是根片段的一个问题,可能是因为将其添加到视图中的事务没有添加到backbackback中,因为这将导致在用户按下back按钮关闭活动时显示额外的空屏幕

更多详情:

  • 根据活动状态管理器dump,my fragment仍有其视图,但MFFragmentId和mContainerId都设置为#0
  • 我确实添加了另一个我在这里没有讨论过的片段,它保留了它的实例,但它只用于保存一些数据,没有任何视图
有一个支持库版本25.1.0及以上版本。 由于已报告此问题,您要么必须等待解决方案,要么可以将支持库版本降级为25.0.1,并获得预期的行为

更新


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

您正在使用的支持库的版本是什么?