繁体   English   中英

弹出 backstack 抛出“Fragment Already added”异常

[英]Popping backstack throws “Fragment Already Added” exception

我一直在尝试解决有关 backstack 管理的最奇怪的问题。

目标是具有以下逻辑(片段由字母 A、B、C 表示):

A -> B, B -> C,当背压时,C -> A

since C can be different fragments and, when in C and backPressed, fragment B should never appear, I add the transition A->B to backstack and B->C is not added, simply replaced B with C, so when I do backPress , C 转到 A。

这在第一次完美运行 - 行为符合预期,但是当我连续第二次尝试时,应用程序崩溃:

getSupportFragmentManager().popBackStackImmediate()

,抛出异常:

java.lang.IllegalStateException: Fragment already added: FragmentC
...

我尝试用getSupportFragmentManager().popBackStack ,但只是在几纳秒后抛出错误。

在尝试从堆栈中弹出片段时,是否有任何原因会引发添加错误? 关于如何解决这个问题的任何想法?

非常感谢提前

它不是由于返回堆栈弹出而引发异常,而是由于(A)已附加而引发异常。 确保在去 B 和 C 时使用 remove 或 replace 以防止 A 在添加/附加的 state 中。

如果没有看到您的代码,很难确切地说出问题所在,但我有一个公平的想法。 片段回栈只存储 FragmentTransactions,而不是实际的片段。 当您单击返回时它会弹出,它只是简单地反转该事务,因为它得到它。 因此,在您的情况下,您首先 go 使用替换事务或任何 [Remove A -> Add B] 转发并添加到后台堆栈。 然后你 go B->C 并且不要将它添加到后台堆栈。 所以backstack现在仍然是[Add A -> Remove B]。 请记住,backstack 只是反向的正向交易。 现在你在 C 上,backstack 不知道并单击返回,Android 执行 backstack。 它添加了 A 并尝试删除 B,但 B 不存在所以什么也没有发生。 所以现在你回到了 A 片段,它下面有 C 片段,你可能不知道。 您可以在调试器中确认此 C 片段位于后面。

现在您说第二次单击返回时它会崩溃。 所以你回到了 A,下面有 C 片段,你从 A->B 开始并添加到后台堆栈。 您可能正在使用replace删除所有添加的片段并添加新片段。 所以交易是[删除A,删除下面的C,添加B]并将其添加到后台堆栈。 现在你是来自 B->C 的 go,这是我在没有看到你的代码的情况下无法确定的一点。 您收到Fragment already added错误,这意味着您必须在从 B->C 的某处获得相同的 C 实例。 您是否在替换中使用了一些findFragmentByTag

因此,您从第一次加载并可见时就拥有相同的 C 片段实例,然后单击返回。 Android 尝试撤消先前的事务并尝试添加有效的 A,然后添加 C,这是与当前可见的片段实例相同的片段实例,您会收到Fragment already added错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM