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)。