如果没有任何帮助,而你需要一个可行的解决方案,你可以选择保险起见,每次打开对话框时将其基本信息保存到活动 ViewModel 中(并在关闭对话框时从此列表中删除)。这些基本信息可以是对话框类型和一些 ID(你需要打开此对话框的信息)。这个 ViewModel 在 Activity 生命周期的更改期间不会被销毁。假设用户打开一个对话框来留下对餐厅的评价。那么对话框类型将是 LeaveReferenceDialog,ID 将是餐厅 ID。当打开此对话框时,你将此信息保存在一个对象中,你可以称之为 DialogInfo,并将此对象添加到 Activity 的 ViewModel 中。这些信息将允许你在 onResume() 被调用时重新打开对话框:
override fun onResume() {
super.onResume()
restoreDialogs()
}
调用哪个函数:
fun restoreDialogs() {
mainActivityViewModel.setIsRestoringDialogs(true)
for (dialogInfo in mainActivityViewModel.openDialogs)
openDialog(dialogInfo)
mainActivityViewModel.setIsRestoringDialogs(false)
}
当ViewModel中的IsRestoringDialogs设置为true时,对话框信息将不会被添加到视图模型的列表中,这很重要,因为我们现在正在恢复已经在列表中的对话框。否则,在使用该列表时更改它会导致异常。因此:
override fun openLeaveReferenceDialog(restaurantId: String) {
var dialog = LeaveReferenceDialog()
val bundle = Bundle()
bundle.putString(Constants.RESTAURANT_ID, restaurantId)
dialog.arguments = bundle
dialog.show(supportFragmentManager, "")
addOpenDialogInfo(DialogInfo(LEAVE_REFERENCE_DIALOG, restaurantId))
}
然后在关闭对话框时删除对话框信息:
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,在活动生命周期期间也不会被销毁。因此,当您打开对话框时,您将获取 ViewModel,并像往常一样使用该对话框的 ViewModel 初始化 UI。