在Android中,对话框被关闭或取消有什么区别?

231

就像标题所说,在安卓中,对话框被取消和被解除有什么区别呢?

5个回答

216

通常情况下,当对话框完成任务并从屏幕中移除时,它会被关闭。当用户想要退出对话框并按下“返回”按钮时,对话框会被取消。

例如,您在屏幕上有一个标准的Yes/No对话框。如果用户单击“No”,则对话框会被关闭,并将“No”的值返回给调用者。如果用户没有选择“Yes”或“No”,而是单击“返回”以退出对话框而不进行选择,则对话框将被取消,并且不会向调用者返回任何值。


1
谢谢回复。我正在尝试设置当用户在日期选择器上按下取消按钮时发生的情况。首先,我尝试使用dismiss监听器,这个方法可以工作,但是如果用户选择了时间,它也会触发。然后我尝试了一个cancel监听器,但即使我按下取消,它也从未触发。你知道我应该怎么做吗? - Aal
2
如果您正在使用DatePickerDialog,则应使用OnDateSetListener在日期更改时得到通知。 如果有人单击取消按钮...那么它不会被调用,对话框将自行消失。 对于DatePickerDialog的正常使用,您不需要设置其他侦听器。 - Lee
提示:后退按钮会同时触发取消监听器和关闭监听器。 - Urban
如果我调用cancel()而不是dismiss()会发生什么? - Ajay Chauhan

33

dismiss 是你必须在代码中明确调用的内容,通常是为了响应对话框中按钮的点击事件。如果您喜欢,在 Activity 中可以调用 dismissDialog,它将进而调用 dismissDialog 上。

cancel 方法仅在代码中明确调用或者当用户在可取消的 Dialog 打开时按下 BACK 按钮时才执行(正如 @Lee 所指出的那样)。

如果使用 DatePicker,那么所有这些情况仍然适用。就像 @Lee 所说,DatePickerDialog.OnDateSetListener 只是检测用户从 DatePicker 中选择日期的情况。

Android Developer Reference 提供了有关 Dialog 的更多信息。


你也可以调用cancel方法。对于取消和关闭,有两个不同的监听器。 - creativecreatorormaybenot

29

关闭 调用关闭方法将对话框从屏幕上移除。这个方法可以安全地从任何线程中调用。请注意,当对话框被关闭时,不应该重写此方法进行清理,而是应该在onStop中实现。

取消 调用取消方法将取消对话框。这本质上与调用关闭()相同,但如果已注册,它还会调用您的DialogInterface.OnCancelListener

隐藏 此方法隐藏对话框,但不会关闭它。

enter image description here

更多详情请点击这里


取消和关闭都有回调函数: 取消 -> setOnCancelListener; 关闭 -> setOnDismissListener; - Владислав Шестернин
@ВладиславШестернин 当然,这并没有什么区别。 - ucMedia

7
区别在于将值返回给调用函数的方式。 dialog.cancel()通常在用户按下返回按钮而不是选择警报对话框提供的选项(如确定/忽略)时被调用,并向调用者返回 null/无值。 而dialog.dismiss()通常在用户从警报对话框提供的选项中进行选择,例如点击对话框上的关闭按钮,将关闭对话框并向调用者返回相应的非空值。就是这样。

3

举个例子

val dialog = AlertDialog.Builder(this@MainActivity)
    .setTitle("Title")
    .setMessage("Message")
    .setPositiveButton("Dismiss") { dialog, _ ->
        dialog.dismiss()
    }.setNegativeButton("Cancel") { dialog, _ ->
        dialog.cancel()
    }.create()

dialog.setOnDismissListener {
    Log.i("TAG", "onDismissListener")
}
dialog.setOnCancelListener {
    Log.i("TAG", "onCancelListener")
}
dialog.show()

当点击 Dismiss 按钮时

onDismissListener

当点击取消按钮时

onCancelListener
onDismissListener

当系统返回按钮

onCancelListener
onDismissListener

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