Android: как проверить, отображается ли диалоговое окно
Я запускаю свой фрагмент диалога, используя
FragmentTransaction ft =
getFragmentManager().beginTransaction();
MyDialogFragment dialog = new MyDialogFragment()
dialog.show(ft, "dialog");
чтобы получить ручку на нем, я делаю
Fragment prev = getFragmentManager().findFragmentByTag("dialog");
но как только я получу prev
, как проверить, отображается ли он?
История истории
Моя проблема в том, что мой код цикла продолжает запускать диалог снова и снова. Но если диалог уже отображается, я не хочу, чтобы он запускался снова.
Эта предыстория предназначена только для контекста. Ответ, который я ищу, не таков: "вытащите его из цикла".
Ответы
Ответ 1
просто проверьте, не null ли он
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.
В качестве альтернативы вы можете проверить активность, с которой связан фрагмент prev
, однако убедитесь, что вы спросите, что после, вы убедитесь, что оно не имеет значения null или вы получите исключение NullPointerException. Вот так:
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 back stack.
else
//There is an active fragment with tag "dialog"
Ответ 2
if (dialogFragment != null
&& dialogFragment.getDialog() != null
&& dialogFragment.getDialog().isShowing()
&& !dialogFragment.isRemoving()) {
//dialog is showing so do something
} else {
//dialog is not showing
}
Ответ 3
Я добавил, что это внутри моего пользовательского диалогового фрагмента, поэтому мне не нужно беспокоиться о какой-либо логике снаружи. Переопределите методы show()
и onDismiss()
с полем boolean shown
:
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);
}
Если вы хотите проверить, отображается ли это или нет, вы можете создать getter для shown
boolean.