Si rien ne vous aide et que vous avez besoin d'une solution qui fonctionne, vous pouvez opter pour la sécurité et, à chaque fois que vous ouvrez un dialogue, sauvegarder ses informations de base dans le ViewModel de l'activité (et les supprimer de cette liste lorsque vous fermez le dialogue). Ces informations de base peuvent être le type de dialogue et un identifiant (les informations dont vous avez besoin pour ouvrir ce dialogue). Ce ViewModel n'est pas détruit pendant les changements du cycle de vie de l'activité. Disons que l'utilisateur ouvre une boîte de dialogue pour laisser une référence à un restaurant. Le type de dialogue serait donc LeaveReferenceDialog et l'id serait l'id du restaurant. Lorsque vous ouvrez cette boîte de dialogue, vous enregistrez ces informations dans un objet que vous pouvez appeler DialogInfo, et vous ajoutez cet objet au ViewModel de l'activité. Ces informations vous permettront de rouvrir la boîte de dialogue lorsque l'activité onResume() sera appelée :
// On resume in Activity
override fun onResume() {
super.onResume()
// Restore dialogs that were open before activity went to background
restoreDialogs()
}
Qui appelle :
fun restoreDialogs() {
mainActivityViewModel.setIsRestoringDialogs(true) // lock list in view model
for (dialogInfo in mainActivityViewModel.openDialogs)
openDialog(dialogInfo)
mainActivityViewModel.setIsRestoringDialogs(false) // open lock
}
Lorsque IsRestoringDialogs dans ViewModel est défini à true, les informations sur les dialogues ne seront pas ajoutées à la liste dans le modèle de vue, et c'est important parce que nous restaurons maintenant les dialogues qui sont déjà dans cette liste. Sinon, modifier la liste pendant son utilisation provoquerait une exception. Donc :
// 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))
}
Ensuite, supprimez les informations de la boîte de dialogue lorsque vous la fermez :
// Dismiss dialog
override fun dismissLeaveReferenceDialog(Dialog dialog, id: String) {
if (dialog?.isAdded()){
dialog.dismiss()
mainActivityViewModel.removeOpenDialog(LEAVE_REFERENCE_DIALOG, id)
}
}
Et dans le ViewModel de l'activité :
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)
}
En fait, vous rouvrez toutes les boîtes de dialogue qui étaient ouvertes auparavant, dans le même ordre. Mais comment font-elles pour conserver leurs informations ? Chaque boîte de dialogue possède son propre ViewModel, qui n'est pas non plus détruit pendant le cycle de vie de l'activité. Ainsi, lorsque vous ouvrez la boîte de dialogue, vous obtenez le ViewModel et vous créez l'interface utilisateur en utilisant ce ViewModel de la boîte de dialogue comme toujours.
1 votes
Comment enregistrer/restaurer le contenu de l'EditText modifié ? Pouvez-vous montrer un peu de code ?
0 votes
J'ai compris le problème, j'avais oublié de récupérer la vue par Id après avoir réinitialisé la mise en page.