在对话框外按下时如何关闭DialogFragment?


80

我正在使用DialogFragment,并且在成功设置图像以在按下时关闭(即关闭)对话框时,当用户单击对话框外部的任何位置时,我很难找到关闭对话框的方法,就像普通对话框。我以为会有某种

dialogFragment.setCanceledOnTouchOutside(true);

电话,但我没有在文档中看到。

这有可能DialogFragment吗?还是我看错地方了?我尝试在“父”活动中拦截触摸事件,但是除了没有得到任何触摸事件之外,这对我来说似乎不合适。

Answers:


177
DialogFragment.getDialog().setCanceledOnTouchOutside(true);

必须被调用onCreateView(如Apurv Gupta所指出的)。


34
必须召集onCreateView
Apurv Gupta 2014年

如果我不希望它取消而是直接关闭怎么办?
jjxtra

57
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
       ...
       getDialog().setCanceledOnTouchOutside(true);
       ... 
       }

•getDialog()。setCanceledOnTouchOutside(true); несработало,сработалоgetDialog()。dismiss();
53МаксимФомичёв

@МаксимФомичёв,впервомслучаепроисходитустановкасвойствадиалога,чтоегоможнозакрыватьнажа。Вовторомслучаевысамипрограммнозакрываетедиалог。
CoolMind

21
    /** The system calls this only when creating the layout in a dialog. */
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // The only reason you might override this method when using onCreateView() is
        // to modify any dialog characteristics. For example, the dialog includes a
        // title by default, but your custom layout might not need it. So here you can
        // remove the dialog title, but you must call the superclass to get the Dialog.
        Dialog dialog = super.onCreateDialog(savedInstanceState);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setCanceledOnTouchOutside(true);

        return dialog;
    }

这对我不起作用。我不得不打电话给setCanceledOnTouchOutsideonCreateView按@Apurv。我要指出,我叫setCanceledOnTouchOutside(false)
kimbaudi

8

这里有很多答案,但是,对话框打开时应用程序崩溃。getDialog().setCanceledOnTouchOutside(true);内部写入onCreateView无效,导致我的应用程序崩溃。

(我正在AppCompatActivity用作我的BaseActivity和android.app.DialogFragment我的片段)。

起作用的是以下两行之一:

getDialog()。setCanceledOnTouchOutside(true);

要么

this.getDialog()。setCanceledOnTouchOutside(true);

里面onActivityCreated

@Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        //getDialog().getWindow().getAttributes().windowAnimations = R.style.DialogAnimationZoom;
        //getDialog().getWindow().setDimAmount(0.85f);
        getDialog().setCanceledOnTouchOutside(true);//See here is the code
    }

不使用什么:

DialogFragment.getDialog()。setCanceledOnTouchOutside(false);

引发以下错误

在此处输入图片说明

而编写代码onCreateView会使应用程序崩溃!如果发现错误,请更新答案。


可能是因为您在中创建了一个对话框onCreateDialog(),这是初始化对话框的常用方法。在这种情况下onCreateView(),什么也不做,甚至不包含视图。您可以尝试将代码移至onCreateDialog()
CoolMind

@CoolMind哦,这是一个很好的观察。一定会将其保留在我的尝试列表中。谢谢!
sud007 '19

我认为,尽管如此,您的回答还是有道理的,有4个人标记为加号。在不久的将来onCreateDialog,我也遇到了问题onCreateView。也许我错了,您应该保留onActivityCreated,这是进行其他初始化的好方法(例如,参见stackoverflow.com/a/50734566/2914140)。
CoolMind

@CoolMind好为您工作。但是我可以注意到,您遇到的问题是由于您的BottomSheet实施。我同意BSheet的情况可能有所不同。但是,此解决方案DialogFragment确实可以很好地工作。
sud007 '19

3
DialogFragment.getDialog().setCanceledOnTouchOutside(false);

它在模糊。我有同样的问题。这适用于Java,而适用于android的Mono则为:

this.getDialog().SetCanceledOnTouchOutside(false);

但是谁问了有关Mono的问题?:/
m0skit0

1
            Dialog.SetCanceledOnTouchOutside(true);

为我工作
我的代码

class dlgRegister : DialogFragment
        {
    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
            {
    ....
    ....
    }
    public override void OnActivityCreated(Bundle savedInstanceState)
            {
                Dialog.Window.RequestFeature(WindowFeatures.NoTitle);
                Dialog.SetCanceledOnTouchOutside(true);
                base.OnActivityCreated(savedInstanceState);
                Dialog.Window.Attributes.WindowAnimations =    Resource.Style.dialog_animation;
            }
    }

1

如果要在单击之外执行某些逻辑DialogFragment,只需重写onCancel方法即可。

override fun onCancel(dialog: DialogInterface) {
    super.onCancel(dialog)
    // Do your work here
}

0

我建议仅在尝试上述解决方案后才使用我的解决方案。我已经在这里描述了我的解决方案。简而言之,我正在检查DialogFragment.getView()的触摸范围。当接触点在DialogFragment之外时,我将关闭Dialog。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.