ในกรณีที่ไม่มีอะไรช่วยได้และคุณต้องการโซลูชันที่ใช้งานได้คุณสามารถไปด้านที่ปลอดภัยและทุกครั้งที่คุณเปิดกล่องโต้ตอบบันทึกข้อมูลพื้นฐานลงใน ViewModel ของกิจกรรม (และลบออกจากรายการนี้เมื่อคุณปิดกล่องโต้ตอบ) ข้อมูลพื้นฐานนี้อาจเป็นประเภทของกล่องโต้ตอบและรหัสบางส่วน (ข้อมูลที่คุณต้องการเพื่อเปิดกล่องโต้ตอบนี้) ViewModel นี้จะไม่ถูกทำลายระหว่างการเปลี่ยนแปลงของวงจรชีวิตของกิจกรรม สมมติว่าผู้ใช้เปิดกล่องโต้ตอบเพื่ออ้างอิงถึงร้านอาหาร ประเภทไดอะล็อกจะเป็น LeaveReferenceDialog และ id จะเป็น id ร้านอาหาร เมื่อเปิดกล่องโต้ตอบนี้คุณจะบันทึกข้อมูลนี้ใน Object ที่คุณสามารถเรียก DialogInfo และเพิ่มวัตถุนี้ใน ViewModel ของกิจกรรม ข้อมูลนี้จะช่วยให้คุณสามารถเปิดกล่องโต้ตอบอีกครั้งเมื่อมีการเรียกกิจกรรม onResume ():
override fun onResume() {
super.onResume()
restoreDialogs()
}
ซึ่งเรียก:
fun restoreDialogs() {
mainActivityViewModel.setIsRestoringDialogs(true)
for (dialogInfo in mainActivityViewModel.openDialogs)
openDialog(dialogInfo)
mainActivityViewModel.setIsRestoringDialogs(false)
}
เมื่อ IsRestoringDialogs ใน ViewModel ถูกตั้งค่าเป็น 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)
}
}
และใน 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 และเริ่มต้น UI โดยใช้ ViewModel ของกล่องโต้ตอบเช่นเคย