Android 当活动在销毁后恢复时,如何从片段管理器中删除片段

Android 当活动在销毁后恢复时,如何从片段管理器中删除片段,android,android-fragments,fragmentmanager,Android,Android Fragments,Fragmentmanager,我有一个包含片段F的活动A。A通过将其推到片段管理器的后堆栈上来显示F。这个片段可以显示一个对话框(更具体地说,一个DialogFragment)D,也可以将它推到同一个片段管理器的后堆栈中 我需要能够在片段F确定的某些情况下关闭对话框D。通常,我会检查D是否在片段管理器的后堆栈上,并使用getFragmentManager().popBackStack()将其删除。但是,如果活动被销毁然后重新创建,则此操作不起作用: 假设我在Android设置中设置了“不保留活动”标志。现在我在应用程序的背景

我有一个包含片段F的活动A。A通过将其推到片段管理器的后堆栈上来显示F。这个片段可以显示一个对话框(更具体地说,一个DialogFragment)D,也可以将它推到同一个片段管理器的后堆栈中

我需要能够在片段F确定的某些情况下关闭对话框D。通常,我会检查D是否在片段管理器的后堆栈上,并使用getFragmentManager().popBackStack()将其删除。但是,如果活动被销毁然后重新创建,则此操作不起作用:

假设我在Android设置中设置了“不保留活动”标志。现在我在应用程序的背景。活动被破坏,碎片也被破坏。现在我再次将应用程序前景化片段F和D在什么时候添加到fragment manager的后堆栈?这是我在a的onPostResume()方法上设置断点后拍摄的屏幕截图,我认为这是在用户可以使用应用程序之前,在活动生命周期中最后一个运行的方法:

您可能会注意到mAdded字段包含2个元素——它们是恢复的片段F和D。但它们还不在后堆栈上,因为mBackStack为null

我希望能够删除D,但Android不会让我这么做,因为它正在等待恢复片段的预先存在状态,并且在onPostResume之后的某段时间才会将它们添加到后堆栈中

所以本质上,我不能从堆栈中删除片段,因为它还不在堆栈中。我也无法阻止它在某个时候被添加到堆栈中,因为,正如您从上面的屏幕截图所看到的,fragment manager将它存储在单独的列表mAdded中,并且我无法使用任何方法将其从mAdded中删除


如何防止已保存的片段被还原?

可能我错了,但如果活动停止,AFAIK AOS根本不会存储该片段。它只能还原最后显示的片段,而不还原堆栈上所有以前的片段。

但是,您可以自己存储堆栈和片段状态。只需删除
onPause
中的对话框,通过
onSaveInstanceState
存储一些标志,然后在
onResume
中恢复或不恢复该标志。

“如果活动停止,AFAIK AOS根本不会存储片段回退”,但在我的例子中,它清楚地存储了2个片段,并且知道如何以正确的顺序将它们放回后台。可能是因为顶部是一个对话框,第一个对话框在下面可见?“只需在onPause中通过onSaveInstanceState删除您的对话框并存储一些标志,然后在onResume中恢复或不恢复即可。”-看起来这可能行得通。我会再搜索一些,如果找不到其他解决方案,我会接受你的答案。