Comment rejeter correctement un DialogFragment?
Les docs disent ceci pour la méthode dismiss()
de la classe Dialog
:
Fermez cette boîte de dialogue et supprimez - la de l'écran. Cette méthode peut être invoquée en toute sécurité à partir de n'importe quel thread. Notez que vous ne devez pas remplacer cette méthode pour faire nettoyage lorsque la boîte de dialogue est rejetée, implémentez-la plutôt dans
onStop()
.
Dans mon code, Tout ce que je fais est d'appeler getDialog().dismiss()
pour le rejeter. Mais je ne fais rien d'autre ou même utiliser onStop()
. Donc, je demande exactement comment rejeter correctement un DialogFragment
pour éviter toute fuite de mémoire, etc..
3 réponses
Tl;dr: Le bon moyen de fermer un DialogFragment
est d'utiliser dismiss()
directement sur la DialogFragment.
Détails: La documentation de DialogFragment unis
Le contrôle de la boîte de dialogue (décider quand l'afficher, le masquer, le rejeter) doit être effectué via L'API ici, pas avec des appels directs sur la boîte de dialogue.
Ainsi, vous ne devriez pas utiliser getDialog().dismiss()
, car cela appellerait dismiss()
sur la boîte de dialogue . Au lieu de cela, vous devez utilisez la méthode dismiss()
du DialogFragment lui-même:
Public void rejeter()
Rejette le fragment et sa boîte de dialogue. Si le fragment a été ajouté à la pile arrière, tout l'état de la pile arrière jusqu'à et y compris cette entrée sera sauté. Sinon, une nouvelle transaction sera validée pour supprimer le fragment.
Comme vous pouvez le voir, cela prend soin non seulement de fermer la boîte de dialogue, mais aussi de gérer les transactions de fragments impliquées dans le processus.
Vous n'avez besoin d'utiliser onStop
que si vous avez explicitement créé des ressources nécessitant un nettoyage manuel(fermeture de fichiers, fermeture de curseurs, etc.). Même alors, je remplacerais onStop
du DialogFragment plutôt que onStop
du dialogue sous-jacent.
Je pense qu'une meilleure façon de fermer un DialogFragment
est la suivante:
Fragment prev = getSupportFragmentManager().findFragmentByTag("fragment_dialog");
if (prev != null) {
DialogFragment df = (DialogFragment) prev;
df.dismiss();
}
De cette façon, vous n'avez pas besoin de tenir une référence au DialogFragment
et pouvez le fermer de partout.
Vous devriez vous rejeter Dialog
dans onPause()
alors remplacez-le.
Aussi avant de rejeter, vous pouvez vérifier null
et montre comme ci-dessous extrait:
@Override
protected void onPause() {
super.onPause();
if (dialog != null && dialog.isShowing()) {
dialog.dismiss();
}
}