web-dev-qa-db-fra.com

android: comment vérifier si dialogfragment est affiché

Je lance mon fragment de dialogue en utilisant

FragmentTransaction ft = 
getFragmentManager().beginTransaction();
MyDialogFragment dialog = new MyDialogFragment()
dialog.show(ft, "dialog");

alors pour obtenir une poignée sur ce que je fais

Fragment prev = getFragmentManager().findFragmentByTag("dialog");

mais une fois que j’ai prev, comment puis-je vérifier s’il est affiché?

histoire précédente

Mon problème est que mon code en boucle continue à lancer la boîte de dialogue encore et encore. Mais si la boîte de dialogue est déjà affichée, je ne veux pas qu'elle se relance. Cette histoire est juste pour le contexte. La réponse que je cherche n'est pas: "déplacez-le hors de la boucle".

55
learner

il suffit de vérifier si c'est nul

if(prev == null)
    //There is no active fragment with tag "dialog"
else
    //There is an active fragment with tag "dialog" and "prev" variable holds a reference to it.

Vous pouvez également vérifier l’activité à laquelle le fragment prev est actuellement associé, mais assurez-vous de demander à après de vous assurer que ce n’est pas nul ou d’obtenir une exception NullPointerException. Comme ça:

if(prev == null)
    //There is no active fragment with tag "dialog"
else
    if(prev.getActivity() != this) //additional check
        //There is a fragment with tag "dialog", but it is not active (shown) which means it was found on device's back stack.
    else
        //There is an active fragment with tag "dialog"
24
nstosic
 if (dialogFragment != null
     && dialogFragment.getDialog() != null
     && dialogFragment.getDialog().isShowing()
     && !dialogFragment.isRemoving()) {
            //dialog is showing so do something 
 } else {
     //dialog is not showing
 }
95
j2emanue

J'ai ajouté que cela se trouvait dans mon fragment de dialogue personnalisé, de sorte que je n'ai pas à m'inquiéter de la logique à l'extérieur. Remplacez les méthodes show() et onDismiss() par un boolean shown champ:

  private static boolean shown = false;

    @Override
    public void show(FragmentManager manager, String tag) {
        if (shown) return;

        super.show(manager, tag);
        shown = true;
    }

    @Override
    public void onDismiss(DialogInterface dialog) {
        shown = false;
        super.onDismiss(dialog);
    }

Si vous voulez vérifier s'il est affiché ou non, vous pouvez créer un getter pour le shown boolean.

48
John Leehey