如果没有任何帮助,并且您需要一个可行的解决方案,您可以安全地进行,每次打开对话框时都将其基本信息保存到活动 ViewModel(并在您关闭对话框时将其从该列表中删除)。此基本信息可能是对话框类型和一些 id(打开此对话框所需的信息)。此 ViewModel 在 Activity 生命周期更改期间不会被销毁。假设用户打开一个对话框以留下对餐厅的引用。所以对话类型是 LeaveReferenceDialog,id 是餐厅 id。打开此对话框时,将此信息保存在可以调用 DialogInfo 的 Object 中,并将此对象添加到 Activity 的 ViewModel。此信息将允许您在调用活动 onResume() 时重新打开对话框:
// On resume in Activity
override fun onResume() {
super.onResume()
// Restore dialogs that were open before activity went to background
restoreDialogs()
}
哪个电话:
fun restoreDialogs() {
mainActivityViewModel.setIsRestoringDialogs(true) // lock list in view model
for (dialogInfo in mainActivityViewModel.openDialogs)
openDialog(dialogInfo)
mainActivityViewModel.setIsRestoringDialogs(false) // open lock
}
当 ViewModel 中的 IsRestoringDialogs 设置为 true 时,对话框信息将不会添加到视图模型中的列表中,这很重要,因为我们现在正在恢复该列表中已经存在的对话框。否则,在使用时更改列表会导致异常。所以:
// Create new dialog
override fun openLeaveReferenceDialog(restaurantId: String) {
var dialog = LeaveReferenceDialog()
// Add id to dialog in bundle
val bundle = Bundle()
bundle.putString(Constants.RESTAURANT_ID, restaurantId)
dialog.arguments = bundle
dialog.show(supportFragmentManager, "")
// Add dialog info to list of open dialogs
addOpenDialogInfo(DialogInfo(LEAVE_REFERENCE_DIALOG, restaurantId))
}
然后在关闭它时删除对话框信息:
// Dismiss dialog
override fun dismissLeaveReferenceDialog(Dialog dialog, id: String) {
if (dialog?.isAdded()){
dialog.dismiss()
mainActivityViewModel.removeOpenDialog(LEAVE_REFERENCE_DIALOG, id)
}
}
在 Activity 的 ViewModel 中:
fun addOpenDialogInfo(dialogInfo: DialogInfo){
if (!isRestoringDialogs){
val dialogWasInList = removeOpenDialog(dialogInfo.type, dialogInfo.id)
openDialogs.add(dialogInfo)
}
}
fun removeOpenDialog(type: Int, id: String) {
if (!isRestoringDialogs)
for (dialogInfo in openDialogs)
if (dialogInfo.type == type && dialogInfo.id == id)
openDialogs.remove(dialogInfo)
}
您实际上以相同的顺序重新打开了之前打开的所有对话框。但是他们如何保留他们的信息呢?每个对话框都有自己的 ViewModel,它在 Activity 生命周期中也不会被销毁。因此,当您打开对话框时,您将获得 ViewModel 并像往常一样使用对话框的此 ViewModel 初始化 UI。