web-dev-qa-db-ja.com

android:dialogfragmentが表示されているかどうかを確認する方法

を使用してダイアログフラグメントを起動します

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

それで私はそれのハンドルを取得します

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

しかし、prevを取得したら、それが表示されているかどうかを確認するにはどうすればよいですか?

バックストーリー

私の問題は、ループするコードが何度もダイアログを起動し続けることです。しかし、ダイアログがすでに表示されている場合は、再度起動したくありません。このバックストーリーは、コンテキストにすぎません。私が求める答えは、「ループの外に移動する」ではありません。

55
learner

単に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が現在関連付けられているアクティビティを確認できますが、afterであることを確認してください。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'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

これをカスタムダイアログフラグメントの内部に追加したので、外部のロジックについて心配する必要はありません。 _boolean shown_フィールドで、show()およびonDismiss()メソッドをオーバーライドします。

_  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);
    }
_

表示されるかどうかを確認する場合は、shownブール値のゲッターを作成できます。

48
John Leehey