android:如何检查dialogfragment是否显示
我使用android:如何检查dialogfragment是否显示,android,android-layout,android-fragments,android-dialogfragment,Android,Android Layout,Android Fragments,Android Dialogfragment,我使用 FragmentTransaction ft = getFragmentManager().beginTransaction(); MyDialogFragment dialog = new MyDialogFragment() dialog.show(ft, "dialog"); 那么,为了解决这个问题,我做了 Fragment prev = getFragmentManager().findFragmentByTag("dialog"); 但是,一旦我得到prev,如何检查它是
FragmentTransaction ft =
getFragmentManager().beginTransaction();
MyDialogFragment dialog = new MyDialogFragment()
dialog.show(ft, "dialog");
那么,为了解决这个问题,我做了
Fragment prev = getFragmentManager().findFragmentByTag("dialog");
但是,一旦我得到prev
,如何检查它是否显示
背景故事
我的问题是我的循环代码一次又一次地启动对话框。但是如果对话框已经显示,我不希望它再次启动。
这个背景故事只是为了上下文。我寻求的答案不是:“将它移出循环。”只需检查它是否为空
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's back stack.
else
//There is an active fragment with tag "dialog"
我将其添加到自定义对话框片段中,因此不必担心外部的任何逻辑。使用显示的
布尔值
字段覆盖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);
}
如果要检查是否显示,可以为显示的布尔值创建一个getter。Kotlin样式:
if (dialogFragment != null
&& dialogFragment.getDialog() != null
&& dialogFragment.getDialog().isShowing()
&& !dialogFragment.isRemoving()) {
//dialog is showing so do something
} else {
//dialog is not showing
}
private fun showDialog(dialogFragment: DialogFragment, tag: String) {
supportFragmentManager.findFragmentByTag(tag).let { fragment ->
fragment ?: let {
supportFragmentManager.beginTransaction().let { transition ->
dialogFragment.show(transition, tag)
}
}
}
}
调用prev.isVisible()。请参阅:不是最佳答案,如果用户在对话框显示时收到呼叫,则对话框将添加两次,因为变量show
将使用值false
再次创建,您必须使show
变量静态
,私有静态布尔值显示=false代码>+1用于前面的注释,并且:如果您从外部为每个对话框调用创建一个新实例,则此方法不适用。有人可能会说,您可以将“show”设置为静态,但我认为这会有其他含义,例如:在void show(…)
更改行:if(show | | manager.isStateSaved())return代码>。太好了!成功了dialog.isVisible()
才是真正的罪魁祸首,有时甚至在对话框可见时也会说false
!!所以,dialogFragment.getDialog().isShowing()
起作用了..就像一个魔咒!这是预期的结果,应该是可接受的答案,但放在最后…如果dialogFragment恰好为null,dialogFragment.getDialog()将给出null指针异常。如果您在一瞬间多次调用dialogFragment的创建,dialogFragment=getSupportFragmentManager().findFragmentByTag(“dialog”)
将返回null,并且将显示所有对话框。如果此检查中还添加了dialogFragment.isRemoving()==false,是否会有所帮助?例如,如果对话框刚刚被取消,这并不总是有效。我遇到了这个问题,有时我想在对话框关闭后立即显示它(我重用了相同的片段来显示“不同”的对话框)。我发现有效的解决方案与下面@j2emanue的解决方案相同<代码>如果(fragment.getDialog()==null | |!fragment.getDialog().isShowing()){fragment.show(fragmentManager,tag);}
(在我的例子中,我已经知道我的片段不是null)。