Prevent Android activity dialog from closing on outside touch

JavaAndroidAndroid ActivityDialogTouch

Java Problem Overview


I have an activity that is using the Theme.Dialog style such that it is a floating window over another activity. However, when I click outside the dialog window (on the background activity), the dialog closes. How can I stop this behaviour?

Java Solutions


Solution 1 - Java

To prevent dialog box from getting dismissed on back key pressed use this

dialog.setCancelable(false);

And to prevent dialog box from getting dismissed on outside touch use this

 dialog.setCanceledOnTouchOutside(false);

Solution 2 - Java

What you actually have is an Activity (even if it looks like a Dialog), therefore you should call setFinishOnTouchOutside(false) from your activity if you want to keep it open when the background activity is clicked.

EDIT: This only works with android API level 11 or greater

Solution 3 - Java

What worked for me was to create DialogFragment an set it to not be cancelable:

dialog.setCancelable(false);

Solution 4 - Java

This could help you. It is a way to handle the touch outside event:

https://stackoverflow.com/questions/4650246/how-to-cancel-an-dialog-themed-like-activity-when-touched-outside-the-window/5831214#5831214

By catching the event and doing nothing, I think you can prevent the closing. But what is strange though, is that the default behavior of your activity dialog should be not to close itself when you touch outside.

(PS: the code uses WindowManager.LayoutParams)

Solution 5 - Java

When using dialog as an activity in the onCreate add this

setFinishOnTouchOutside(false);

Solution 6 - Java

For higher API 10, the Dialog disappears when on touched outside, whereas in lower than API 11, the Dialog doesn't disappear. For prevent this, you need to do:

In styles.xml: <item name="android:windowCloseOnTouchOutside">false</item>

OR

In onCreate() method, use: this.setFinishOnTouchOutside(false);

Note: for API 10 and lower, this method doesn't have effect, and is not needed.

Solution 7 - Java

Setting the dialog cancelable to be false is enough, and either you touch outside of the alert dialog or click the back button will make the alert dialog disappear. So use this one:

setCancelable(false)

And the other function is not necessary anymore: dialog.setCanceledOnTouchOutside(false);

If you are creating a temporary dialog and wondering there to put this line of code, here is an example:

new AlertDialog.Builder(this)
                        .setTitle("Trial Version")
                        .setCancelable(false)
                        .setMessage("You are using trial version!")
                        .setIcon(R.drawable.time_left)
                        .setPositiveButton(android.R.string.yes, null).show();

Solution 8 - Java

Dialog dialog = new Dialog(context)
dialog.setCanceledOnTouchOutside(true); 
//use this to dismiss the dialog on outside click of dialog

dialog.setCanceledOnTouchOutside(false);
//use this for not to dismiss the dialog on outside click of dialog.

Watch this link for more details about dialog.

dialog.setCancelable(false);
//used to prevent the dismiss of dialog on backpress of that activity

dialog.setCancelable(true);
//used to dismiss the dialog on onbackpressed of that activity

Solution 9 - Java

Use This Code it's Working For me

 AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
 alertDialog.setCancelable(false);

Solution 10 - Java

Alert Dialog is deprecated so use Dialog dialog = new Dialog(this);

For prevent close on outside touch

dialog.setCanceledOnTouchOutside(false);

Solution 11 - Java

Simply,

alertDialog.setCancelable(false);

prevent user from click outside of Dialog Box.

Solution 12 - Java

I use this in onCreate(), seems to work on any version of Android; tested on 5.0 and 4.4.x, can't test on Gingerbread, Samsung devices (Note 1 running GB) have it this way by default:

	if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
	{
		setFinishOnTouchOutside(false);
	}
	else
	{
		getWindow().clearFlags(LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH);
	}

	super.onCreate(savedInstanceState);

Solution 13 - Java

Use setFinishOnTouchOutside(false) for API > 11 and don't worry because its android's default behavior that activity themed dialog won't get finished on outside touch for API < 11 :) !!Cheerss!!

Solution 14 - Java

        alert.setCancelable(false);
    	alert.setCanceledOnTouchOutside(false);

I guess this will help you.It Worked For me

Solution 15 - Java

Here is my solution:

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Select The Difficulty Level");
builder.setCancelable(false);

Solution 16 - Java

Also is possible to assign different action implementing onCancelListener:

alertDialog.setOnCancelListener(new DialogInterface.OnCancelListener(){                   
    @Override
    public void onCancel(DialogInterface dialogInterface) {
        //Your custom logic
    } 
});

Solution 17 - Java

I was facing the same problem. To handle it I set a OntouchListener to the dialog and do nothing inside. But Dialog dismiss when rotating screen too. To fix it I set a variable to tell me if the dialog has normally dismissed. Then I set a OnDismissListener to my dialog and inside I check the variable. If the dialog has dismmiss normally I do nothin, or else I run the dialog again (and setting his state as when dismissing in my case).

Solution 18 - Java

builder.setCancelable(false);


public void Mensaje(View v){

    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("¿Quieres ir a el Menú principal?");
    builder.setMessage("Al presionar SI iras a el menú y saldras de la materia.");
    builder.setPositiveButton("SI", null);
    builder.setNegativeButton("NO", null);
    builder.setCancelable(false);
    builder.show();
}

Solution 19 - Java

In jetpack compose, use dismissOnClickOutside = false property to prevent from closing.

    AlertDialog(
        title = {
            Text("Title")
        },
        text = {
            Text(text = name)
        },
        onDismissRequest = onDismiss,
        confirmButton = {
            TextButton(onClick = onDismiss ) {
                Text("Yes")
            }
        },
        dismissButton = {
            TextButton(onClick = onDismiss ) {
                Text("Cancel")
            }
        },
        properties = DialogProperties(
            dismissOnClickOutside = false
        )
    )

}

Solution 20 - Java

This is the perfect answer to all your questions.... Hope you enjoy coding in Android

new AlertDialog.Builder(this)
            .setTitle("Akshat Rastogi Is Great")
            .setCancelable(false)
            .setMessage("I am the best Android Programmer")
            .setPositiveButton("I agree", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();

                }
            })
            .create().show();

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
QuestionFergusmacView Question on Stackoverflow
Solution 1 - JavaSinghakView Answer on Stackoverflow
Solution 2 - JavaartexView Answer on Stackoverflow
Solution 3 - JavaPetrView Answer on Stackoverflow
Solution 4 - JavaMichel-F. PortzertView Answer on Stackoverflow
Solution 5 - JavaRonny ShibleyView Answer on Stackoverflow
Solution 6 - JavailwView Answer on Stackoverflow
Solution 7 - JavaBillOverFlowView Answer on Stackoverflow
Solution 8 - Javaanand krishView Answer on Stackoverflow
Solution 9 - JavaAslam PatelView Answer on Stackoverflow
Solution 10 - JavaMuhammed FasilView Answer on Stackoverflow
Solution 11 - Javauser7868389View Answer on Stackoverflow
Solution 12 - Java3c71View Answer on Stackoverflow
Solution 13 - JavaVishal PandeyView Answer on Stackoverflow
Solution 14 - Javauser2532065View Answer on Stackoverflow
Solution 15 - JavaAkhter Al AminView Answer on Stackoverflow
Solution 16 - JavaAdae RodríguezView Answer on Stackoverflow
Solution 17 - JavaMadaraView Answer on Stackoverflow
Solution 18 - JavaAlex SkriivordemgentschenfeldeView Answer on Stackoverflow
Solution 19 - Javaburak isikView Answer on Stackoverflow
Solution 20 - JavaAkshat RasogiView Answer on Stackoverflow