84

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

dialogFragment.setCanceledOnTouchOutside(true);

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

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

4

8 回答 8

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

必须被召唤onCreateView(正如 Apurv Gupta 指出的那样)。

于 2012-01-06T17:18:37.340 回答
59
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
       ...
       getDialog().setCanceledOnTouchOutside(true);
       ... 
       }
于 2012-01-06T23:25:03.260 回答
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;
    }
于 2014-07-08T14:06:21.580 回答
10

这里有很多答案,但是当对话框打开时应用程序崩溃。getDialog().setCanceledOnTouchOutside(true);在里面写东西onCreateView没有用,我的应用程序崩溃了。

(我AppCompatActivity用作我的 BaseActivity 和android.app.DialogFragment我的 Fragment)。

有效的是以下两行之一:

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并在应用程序崩溃中编写代码!如果您发现有问题,请更新答案。

于 2017-04-06T08:48:22.060 回答
4

如果你想在点击外部时执行一些逻辑DialogFragment,只需覆盖 onCancel 方法。

override fun onCancel(dialog: DialogInterface) {
    super.onCancel(dialog)
    // Do your work here
}
于 2020-01-22T15:46:16.933 回答
3
DialogFragment.getDialog().setCanceledOnTouchOutside(false);

是打错了。我有同样的问题。这适用于 Java 和 Mono for android Mono 将是:

this.getDialog().SetCanceledOnTouchOutside(false);
于 2012-10-10T20:50:48.387 回答
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;
            }
    }
于 2017-03-14T08:55:23.410 回答
0

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

于 2015-01-20T10:43:12.430 回答