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".
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"
if (dialogFragment != null
&& dialogFragment.getDialog() != null
&& dialogFragment.getDialog().isShowing()
&& !dialogFragment.isRemoving()) {
//dialog is showing so do something
} else {
//dialog is not showing
}
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.