【发布时间】:2015-04-08 20:50:24
【问题描述】:
我有一个包含片段 F 的活动 A。A 通过将 F 推送到片段管理器的后台堆栈来显示 F。该片段可能会显示一个对话框(更具体地说,是一个 DialogFragment)D,也可以通过将其推送到同一个片段管理器的后台堆栈。
在某些由片段 F 确定的情况下,我需要能够关闭对话框 D。通常我会检查 D 是否在片段管理器的后台堆栈上并使用 getFragmentManager().popBackStack() 将其删除。但是,如果 Activity 被销毁然后重新创建,这将不起作用:
假设我在 Android 设置中设置了“不保留活动”标志。现在我后台应用程序。活动被破坏,碎片也是。现在我再次将应用程序置于前台。 片段 F 和 D 什么时候被添加到片段管理器的后台堆栈? 这是我在 A 的 onPostResume() 方法上设置断点后截取的屏幕截图,我认为这是最后一个在用户可以使用应用程序之前在活动生命周期中运行:
您可能会注意到 mAdded 字段包含 2 个元素 - 即恢复的片段 F 和 D。但它们尚未在后堆栈上,因为 mBackStack 为空!
我希望能够删除 D,但 Android 不会让我这样做,因为它正在等待恢复片段的预先存在状态,并且直到 onPostResume 之后的一段时间才会将它们添加到后台堆栈.
所以本质上,我不能从堆栈中删除片段,因为它还没有在堆栈上。而且我也无法阻止它在某个时候被添加到堆栈中,因为正如您从上面的屏幕截图中看到的那样,片段管理器将其存储在单独的列表 mAdded 中,并且没有任何方法可以用来从中删除它已添加。
如何防止恢复已保存的片段?
【问题讨论】:
标签: android android-fragments fragmentmanager