弹出整个FragmentManager时不显示初始片段BackStack
实际问题/ TL; DR:除了使用单向方式时我认为是黑客,我无法弹出活动的整个后台堆栈以返回到初始状态,的onCreate()。该片段存在于活动状态管理器转储中,但不可见,使我留下一个空白屏幕。弹出整个FragmentManager时不显示初始片段BackStack
我今天遇到这个问题,主要是试图了解这是由于错误还是由于我对FragmentManager的BackStack的误解造成的。我想确保我没有滥用碎片或建立在不稳定的API基础上。
我有一个活动,实质上提供一个下降的“树”导航作为按钮的网格,其中每个按钮打开一个子网格(例如具有更多按钮的子类别)或一些自定义窗体。表单内容无关紧要,但用户需要重复填写各种订单。
我使用来自支持库(support-v4:25.1.1)的Fragments,并且每当需要新的“屏幕”(对于表单或子网格)时,它将使用事务上的事务来添加FragmentManager类似于:
/* adding a new screen, going further down our nav tree */
fragmentManager
.beginTransaction()
.addToBackStack("...")
.replace(R.id.container, newFragment)
.commit();
每一笔交易看起来像这样,除了我的活动,这增加了最初的“根格”片段不添加交易到backstate的初始状态的设置。
/* adding the initial fragment during the first execution of activity's onCreate(). */
fragmentManager
.beginTransaction()
.replace(R.id.container, rootFragment)
.commit();
我在这里发帖的原因是,我遇到了试图弹出整个堆栈中,这是为了使用户返回到活动的初始状态它有根格当一个很奇怪的行为(在上面的代码中添加的那个)。几乎我尝试过的所有技术都清除了后台,但留下了一个空白屏幕,而不是我最初的主菜单网格。在这里多个问题和文档四处寻找后,我尝试多种解决方案,只有这个技巧,看一个人的工作:
int remainingEntries = fragmentManager.getBackStackEntryCount();
while (remainingEntries-- > 0) {
fragmentManager.popBackStackImmediate();
}
我说这似乎是一个黑客,因为它要求我立即(同步)弹出堆栈中条目的任意数量达到了根,而从我的理解,应该可以做,与一个异步方法调用:
fragmentManager.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
或者我也看到了张贴在这里:
int id = fragmentManager.getBackStackEntryAt(0).getId();
fragmentManager.popBackStack(id, FragmentManager.POP_BACK_STACK_INCLUSIVE);
这只是根片段的一个问题,可能是因为将它添加到视图的事务没有添加到backstack,因为这会在用户按下后退按钮时显示额外的空白屏幕关闭活动。
更多细节:
- 根据活动状态管理器倾倒我的片段仍然有其看法,但同时具有mFragmentId和mContainerId设置为#0。
- 我添加了另一个片段,我没有在这里讨论过,它保留了它的实例,但它仅用于保存一些数据,并且没有任何视图。
支持库版本25.1.0及以上版本中有PopBackStackImmediate bug。 由于此问题已被报告,您要么等待解决方案,要么将您的支持库版本降级到25.0.1,并获得预期的行为。
UPDATE
貌似这个bug已经在支持库版本25.3.1 得到解决。将您的库更新到版本25.3.1。
您正在使用的支持库的版本是什么? – VishalKale