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

时间:2011-12-06 17:29:22

标签: android fragment dismiss

我正在使用DialogFragment,当我按下时成功设置图像关闭(即关闭)对话框时,我很难找到在用户点击任何地方时关闭对话框的方法在它之外,就像它适用于普通对话框一样。我以为会有某种

dialogFragment.setCanceledOnTouchOutside(true);

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

这可能与DialogFragment完全相同吗?或者我在错误的地方寻找?我尝试拦截“父母”活动中的触摸事件,但除了没有接触任何触摸事件外,它对我来说似乎不对。

8 个答案:

答案 0 :(得分:161)

DialogFragment.getDialog().setCanceledOnTouchOutside(true);

必须在onCreateView中调用(正如Apurv Gupta指出的那样)。

答案 1 :(得分:55)

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

答案 2 :(得分:19)

    /** 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;
    }

答案 3 :(得分:4)

这里有很多答案但是,对话框打开时应用程序崩溃了。 在getDialog().setCanceledOnTouchOutside(true);内写onCreateView无法正常工作并使我的应用崩溃。

(我使用AppCompatActivity作为我的BaseActivity,使用android.app.DialogFragment作为我的片段。)

以下两行中的任何一行都有效:

  

getDialog()setCanceledOnTouchOutside(真);

OR

  

this.getDialog()setCanceledOnTouchOutside(真);

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(假);

抛出以下错误

enter image description here

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

答案 4 :(得分:1)

DialogFragment.getDialog().setCanceledOnTouchOutside(false);

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

this.getDialog().SetCanceledOnTouchOutside(false);

答案 5 :(得分:1)

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

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

答案 6 :(得分:0)

我建议在尝试上述解决方案后才使用我的解决方案。我已经描述了我的解决方案here。简而言之,我正在检查DialogFragment.getView()的触摸界限。当触摸点在DialogFragment之外时,我正在解雇Dialog。

答案 7 :(得分:0)

            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;
            }
    }