Подтвердить что ты не робот

Android: как проверить, отображается ли диалоговое окно

Я запускаю свой фрагмент диалога, используя

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

чтобы получить ручку на нем, я делаю

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

но как только я получу prev, как проверить, отображается ли он?

История истории

Моя проблема в том, что мой код цикла продолжает запускать диалог снова и снова. Но если диалог уже отображается, я не хочу, чтобы он запускался снова. Эта предыстория предназначена только для контекста. Ответ, который я ищу, не таков: "вытащите его из цикла".

4b9b3361

Ответ 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.