我有一个活动A,其中包含片段F. A通过将其推送到片段管理器的后台堆栈来显示F.这个片段可以显示一个对话框(更具体地说,一个DialogFragment)D,也可以将它推送到同一个片段管理器的后栈。
我需要能够在片段F确定的某些情况下解除对话框D.通常我会检查D是否在片段管理器的后台堆栈上并使用getFragmentManager()。popBackStack()来删除它。但是如果活动被破坏然后重新创建,这不起作用:
假设我在Android设置中设置了“不要保留活动”标志。现在我开始应用该应用。活动被破坏,碎片也被破坏了。现在我再次前景应用程序。 片段F和D在什么时候被添加到片段管理器的后栈?这是我在A的onPostResume()方法上放置断点后的截图,我假设它是最后一个在用户可以使用该应用程序之前在活动生命周期中运行:
你可能会注意到mAdded字段包含2个元素 - 那些是已恢复的片段F和D. 但它们还没有在后面的堆栈上,因为mBackStack为null!
我希望能够删除D,但Android不会让我这样做,因为它正在等待恢复预先存在的片段状态,并且在onPostResume之后的某个时间它不会将它们添加到后台堆栈
所以从本质上讲,我无法从堆栈中删除片段,因为它还没有在堆栈中。而且我也无法阻止它在某些时候被添加到堆栈中,因为从上面的屏幕截图中可以看出,片段管理器将它存储在一个单独的列表中,并且没有任何方法可以用来将其从mAdded。
如何防止保存的片段被还原?
答案 0 :(得分:1)
也许我错了,但如果活动停止,AFAIK AOS根本不会存储片段后台堆栈。它只能恢复最后显示的片段而没有堆栈中的所有先前片段
但是,您可以自己存储堆栈和碎片状态。只需在onPause
中删除您的对话框,然后通过onSaveInstanceState
存储一些标记,然后在onResume
中将其恢复或不恢复。