【问题标题】:How to remove fragment from fragment manager when activity is restored after being destroyed如何在销毁后恢复活动时从片段管理器中删除片段
【发布时间】: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


    【解决方案1】:

    也许我错了,但如果活动停止,AFAIK AOS 根本不会存储片段回栈。它只能恢复最后显示的片段,而没有堆栈上的所有先前片段。
    但是,您可以自己存储堆栈和片段状态。只需删除您在onPause 中的对话框,通过onSaveInstanceState 存储一些标志,然后在onResume 中恢复它或不恢复它。

    【讨论】:

    • “如果活动停止,AFAIK AOS 根本不存储片段回栈” - 有趣,但在我的情况下,它清楚地存储了 2 个片段,并且知道如何以正确的顺序将它们放回回栈。也许是因为顶部是一个对话框,而第一个在下面可见?
    • “只需在 onPause 中删除您的对话框,通过 onSaveInstanceState 存储一些标志,然后在 onResume 中恢复它或不恢复它。” - 看起来这可能有效。我会再搜索一些,如果我没有找到其他解决方案,我会接受您的回答。
    猜你喜欢
    • 2015-10-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-16
    • 1970-01-01
    相关资源
    最近更新 更多