を使用してダイアログフラグメントを起動します
FragmentTransaction ft =
getFragmentManager().beginTransaction();
MyDialogFragment dialog = new MyDialogFragment()
dialog.show(ft, "dialog");
それで私はそれのハンドルを取得します
Fragment prev = getFragmentManager().findFragmentByTag("dialog");
しかし、prev
を取得したら、それが表示されているかどうかを確認するにはどうすればよいですか?
バックストーリー
私の問題は、ループするコードが何度もダイアログを起動し続けることです。しかし、ダイアログがすでに表示されている場合は、再度起動したくありません。このバックストーリーは、コンテキストにすぎません。私が求める答えは、「ループの外に移動する」ではありません。
単に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"
if (dialogFragment != null
&& dialogFragment.getDialog() != null
&& dialogFragment.getDialog().isShowing()
&& !dialogFragment.isRemoving()) {
//dialog is showing so do something
} else {
//dialog is not showing
}
これをカスタムダイアログフラグメントの内部に追加したので、外部のロジックについて心配する必要はありません。 _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
ブール値のゲッターを作成できます。