How to dismiss a DialogFragment when pressing outside the dialog?

AndroidFragmentDismiss

Android Problem Overview


I am using a DialogFragment, and while I have successfully set an image to close (i.e. dismiss) the dialog when pressed, I am having a hard time finding the way to dismiss the dialog when the user clicks anywhere outside it, just as it works with normal dialogs. I thought there would be some sort of

dialogFragment.setCanceledOnTouchOutside(true);

call, but I don't see that in the documentation.

Is this possible with DialogFragment at all? Or am I looking in the wrong places? I tried intercepting touch events in the 'parent' activity but apart from not getting any touch event, it didn't seem right to me.

Android Solutions


Solution 1 - Android

DialogFragment.getDialog().setCanceledOnTouchOutside(true);

Must be called in onCreateView (as Apurv Gupta pointed out).

Solution 2 - Android

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

Solution 3 - Android

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

Solution 4 - Android

Lot of answers here but, the app crash when dialog opens. Writing getDialog().setCanceledOnTouchOutside(true); inside onCreateView did not work and crashed my app.

(I am using AppCompatActivity as my BaseActivity and android.app.DialogFragment as my Fragment).

What works is either of the two following lines:

> getDialog().setCanceledOnTouchOutside(true);

OR > this.getDialog().setCanceledOnTouchOutside(true);

inside onActivityCreated like

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

What not to use:

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

throws following error

enter image description here

And writing the code in onCreateView crashes the App! Please update the answer if you find something wrong.

Solution 5 - Android

If you want to execute some logic when clicking outside of a DialogFragment, just override the onCancel method.

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

Solution 6 - Android

DialogFragment.getDialog().setCanceledOnTouchOutside(false);

It was mistyping. I had the same problem. This works fine for Java and Mono for android Mono will be:

this.getDialog().SetCanceledOnTouchOutside(false);

Solution 7 - Android

            Dialog.SetCanceledOnTouchOutside(true);

Worked for me
My Code

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

Solution 8 - Android

I would recommend to use my solution only after trying out above solutions. I have described my solution here. Just to brief, I am checking touch bounds of DialogFragment.getView(). When touch points are outside DialogFragment, I am dismissing the Dialog.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionsoleView Question on Stackoverflow
Solution 1 - AndroidHamedView Answer on Stackoverflow
Solution 2 - AndroidmanuzhangView Answer on Stackoverflow
Solution 3 - AndroidYakiv MospanView Answer on Stackoverflow
Solution 4 - Androidsud007View Answer on Stackoverflow
Solution 5 - AndroidThomasView Answer on Stackoverflow
Solution 6 - AndroidEugene BosikovView Answer on Stackoverflow
Solution 7 - AndroidshamView Answer on Stackoverflow
Solution 8 - AndroidSwaroopView Answer on Stackoverflow