当弹出整个FragmentManager背面堆栈时,初始片段未呈现



实际问题/tl; dr:除了使用一种方法时,我无法弹出活动的整个背包,以返回我的初始状态,并在oncreate期间添加一个片段()。该片段存在于活动状态经理转储中,但不可见,给我留下一个空屏幕。

我今天遇到了这个问题,主要是在试图了解这是由于错误还是我对FragmentManager的背包的误解引起的。我想确保我不会滥用碎片或在摇摇欲坠的API基础上建立。

我有一项活动,本质上提供了降级的"树"导航作为按钮网格,每个按钮都打开一个子网格(例如带有更多按钮的子类别)或某些自定义表单。表格的内容无关紧要,但希望用户重复填写各种订单。

i使用支持库中的片段(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();

我在这里发布的原因是,我在尝试弹出整个背包时遇到了非常奇怪的行为,这应该使用户回到具有根网格的活动的初始状态(添加了一个添加的活动在上面的代码中)。我尝试过的几乎每种技术都可以有效地清除背包,但留下一个空屏幕而不是我的初始Mainu网格。在这里查看了多个问题和文档之后,我尝试了多种解决方案,只有这个看上去很黑的解决方案才起作用:

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

这只是根部片段的问题,可能是因为将其添加到视图的事务不会添加到背包中,因为当用户按下后退按钮关闭时,这将导致显示一个额外的空屏幕活动。

更多详细信息:

  • 根据活动状态经理,转储我的片段仍然有其视图,但MfragmentID和McOntainerid都设置为#0。
  • 我确实添加了我在此处没有讨论过的实例的另一个片段,但它仅用于保存一些数据,并且没有任何视图。

支持库版本中有一个popbackstackimediate错误 25.1.0及以上。由于已经报告了此问题,要么您必须等待解决方案,要么将支持库版本降级到25.0.1 并获得预期的行为。

update

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

最新更新