Android 弹跳背向投掷”;已添加的片段";例外

Android 弹跳背向投掷”;已添加的片段";例外,android,android-fragments,back-stack,Android,Android Fragments,Back Stack,我一直在试图解决有关后台管理的最奇怪的问题 目标是具有以下逻辑(片段由字母A、B、C表示): A->B,B->C,当按下时,C->A 因为C可以是不同的片段,当在C和backPress中时,片段B永远不会出现,我将转换A->B添加到Backback,B->C没有添加,只是用C替换了B,所以当我进行backPress时,C转到A 这在第一次使用时效果很好-行为如预期,但当我连续第二次尝试时,应用程序崩溃: getSupportFragmentManager().PopBackbackImmedia

我一直在试图解决有关后台管理的最奇怪的问题

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

A->B,B->C,当按下时,C->A

因为C可以是不同的片段,当在C和backPress中时,片段B永远不会出现,我将转换A->B添加到Backback,B->C没有添加,只是用C替换了B,所以当我进行backPress时,C转到A

这在第一次使用时效果很好-行为如预期,但当我连续第二次尝试时,应用程序崩溃:

getSupportFragmentManager().PopBackbackImmediate()

,引发异常:

java.lang.IllegalStateException:已添加片段:FragmentC

我尝试用
getSupportFragmentManager().popbackbackstack
替换,但几纳秒后就会抛出错误

在尝试从堆栈中弹出片段时,抛出添加片段的错误有什么原因吗?有没有办法解决这个问题


提前非常感谢

它不会因为后堆栈弹出而引发异常,而是因为(a)已连接而引发异常。确保在转到B和C时使用“删除”或“替换”,以防止A处于“添加/连接”状态

如果没有看到您的代码,很难准确地说出问题所在,但我有一个公平的想法。片段backstack只存储片段事务,而不是实际的片段。当你点击后退时弹出它,它只是在得到它时反转这个事务。因此,在您的情况下,您首先执行替换事务或任何[Remove a->Add B]并添加到Backback。然后你去B->C,不要把它添加到后台。因此,后退现在仍然是[Add A->Remove B]。记住,后退只是反向的向前交易。现在你在C上,Backback不知道,点击back,Android执行Backbackback。它添加了A并试图删除B,但是B不存在,所以什么也没有发生。现在你又回到了A片段,下面是C片段,你可能不知道。您可以在调试器中确认此C片段已过期

现在你说它在你第二次点击后退时崩溃了。所以你回到A上,下面是C片段,你从A->B开始,添加到Backback。您可能正在使用删除所有添加的片段并添加新片段的。因此,事务是[移除A,移除下面的C,添加B],并将其添加到backbackback。现在你从B->C开始,如果没有看到你的代码,我就不能确定这一点。您得到了一个已添加的
片段
错误,这意味着您从B->C转到某个位置时必须获得相同的C实例。您是否在替换中使用了一些
findframentbytag


因此,您拥有第一次加载并可见的相同C片段实例,然后单击“上一步”。Android试图撤销之前的事务,并尝试添加一个有效的,然后添加与当前可见的片段实例相同的C,您得到的
片段已经添加了
错误。

您添加或更新了片段吗?如果每次都要添加,那么就会出现一些代码。