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..

90
demandé sur stkent 2012-06-26 09:05:51

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.

149
répondu Heinzi 2012-08-28 15:35:35

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.

53
répondu Terel 2018-05-29 20:40:39

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();
    }
}
1
répondu Venky 2017-02-24 04:24:17