防止 Android 活动对话框在外部触摸时关闭

281

我有一个使用Theme.Dialog样式的活动,使其成为另一个活动上方的浮动窗口。然而,当我单击对话框窗口之外的区域(即背景活动)时,对话框会关闭。如何停止这种行为?


1
顺便问一下,如果您想要的行为是对话框的行为,为什么不使用对话框呢?至于您的问题,我认为没有解决方案。 - Kumar Bibek
@KumarBibek 当涉及到布局定制时,对话框的限制很大...这就是为什么要使用活动。即使开发者文档也推荐使用此方法进行灵活的自定义。 - Leo
1
而 OP 想要的是一个模态对话框,即强制用户响应的对话框,例如 OK 或 Yes/No。用户不应该能够轻易地点击关闭。 - SMBiggs
20个回答

11

简单来说,

alertDialog.setCancelable(false);

防止用户在对话框外单击。


6

我在onCreate()中使用这个方法,似乎适用于任何版本的Android系统;已经测试过5.0和4.4.x的版本,无法测试Gingerbread版本,三星设备(Note 1运行GB)默认采用此方式:

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

    super.onCreate(savedInstanceState);

适用于作为对话框使用的活动的完美答案,而不是警报对话框类。 - Himani
OP的问题是关于活动,而不是警报对话框。 - 3c71

5

对于 API > 11,请使用 setFinishOnTouchOutside(false)。不用担心,因为对于 API < 11,Android 的默认行为是主题为对话框的活动不会在触摸外部时结束 :) !!干杯!!


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

我想这可以帮到你。对我有用。


2
请尝试解释为什么这个方法会起作用,只给出代码是不够的。 - Codebender

3

以下是我的解决方案:

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

2

同时,可以通过实现onCancelListener来分配不同的操作:

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

我该如何判断点击警告对话框外部而取消的情况? - cegprakash
在点击警告对话框外部时创建自定义操作非常有帮助! - Adam S.

1

builder.setCancelable(false);


公共的 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();
}

1
嗨,Alex。欢迎来到StackOverflow并感谢您的回答。您能否编辑您的答案以描述您的代码是如何解决OP的问题的?仅提供代码的答案是不被鼓励的,因为它们不能教授或解释“为什么”。谢谢! - Tim Malone

1
我曾面临同样的问题。为了解决它,我在对话框中设置了一个OntouchListener并且什么也没有做。但是旋转屏幕时对话框会消失。为了修复它,我设置了一个变量来告诉我对话框是否已经正常关闭。然后我在我的对话框上设置了一个OnDismissListener,在里面检查这个变量。如果对话框已经正常关闭,我什么也不做,否则我再次运行对话框(并在我的情况下将其状态设置为关闭时的状态)。

0
在Jetpack Compose中,使用dismissOnClickOutside = false属性来防止关闭。
    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
        )
    )

}


-2

这是你所有问题的完美答案... 希望你喜欢在安卓上编程

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

1
感谢您提供这段代码片段,它可能会提供一些有限的、即时的帮助。通过展示为什么这是一个好的解决方案,适当的解释将极大地提高其长期价值,并使其对未来有类似问题的读者更有用。请编辑您的答案,添加一些解释,包括您所做的假设。 - Maximilian Peters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接