如何使用 Kotlin 在 Android 中创建自定义是/否对话框?
Android AlertDialog 用于向用户显示一个小窗口,以通过 OK、Yes 或 Cancel 按钮或输入其他信息来做出决定。它通常是模态的,需要用户在继续之前采取任何行动。在本文中,我们将使用 AlertDialog 创建一个可重用的通用解决方案,当用户只需要回答是或否时。下面提供了一个示例视频,以了解我们将在本文中做什么。
入门
打开 Android Studio 并导入启动项目。创建一个新类 CustomDialog.kt 来包含我们的对话框。我们的 CustomDialog 使用 AlertDialog.Builder 需要的上下文进行初始化。 show函数设置要显示给用户的消息的标题和内容。
Kotlin
import android.app.AlertDialog
import android.content.Context
class CustomDialog(context: Context) : AlertDialog.Builder(context) {
fun show(title: String, message: String) {
val builder = AlertDialog.Builder(context)
builder.setTitle(title)
builder.setMessage(message)
builder.setIcon(android.R.drawable.ic_dialog_alert)
// Create the AlertDialog
val alertDialog: AlertDialog = builder.create()
// Set other dialog properties
alertDialog.setCancelable(false)
alertDialog.show()
}
}
Kotlin
lateinit var onResponse: (r : ResponseType) -> Unit
enum class ResponseType {
YES, NO
}
Kotlin
import android.app.AlertDialog
import android.content.Context
class WineDialog(context: Context) : AlertDialog.Builder(context) {
lateinit var onResponse: (r : ResponseType) -> Unit
enum class ResponseType {
YES, NO, CANCEL
}
fun show(title: String, message: String, listener: (r : ResponseType) -> Unit) {
val builder = AlertDialog.Builder(context)
builder.setTitle(title)
builder.setMessage(message)
builder.setIcon(android.R.drawable.ic_dialog_alert)
onResponse = listener
// performing positive action
builder.setPositiveButton("Yes") { _, _ ->
onResponse(ResponseType.YES)
}
// performing negative action
builder.setNegativeButton("No") { _, _ ->
onResponse(ResponseType.NO)
}
// Create the AlertDialog
val alertDialog: AlertDialog = builder.create()
// Set other dialog properties
alertDialog.setCancelable(false)
alertDialog.show()
}
}
Kotlin
CustomDialog(context).show(getString(R.string.alert_title),
getString(R.string.are_you_sure)) {
Toast.makeText(applicationContext,
it.toString(),
Toast.LENGTH_LONG).show()
}
现在我们需要实现一种机制,让用户根据点击的按钮做出反应。为此,我们将使用 Kotlin 中的可能性将函数声明为变量。这里的 onResponse 是一个函数,它接受 1 个 ResponseType 类型的参数并且不返回任何内容。枚举 ResponseType 列出了对话框中可能的按钮。我们还可以添加 CANCEL。
科特林
lateinit var onResponse: (r : ResponseType) -> Unit
enum class ResponseType {
YES, NO
}
现在 show函数需要接收用户 ResponseType函数作为参数,并在单击 2 个按钮之一时调用它。 CustomDialog 的最终代码
科特林
import android.app.AlertDialog
import android.content.Context
class WineDialog(context: Context) : AlertDialog.Builder(context) {
lateinit var onResponse: (r : ResponseType) -> Unit
enum class ResponseType {
YES, NO, CANCEL
}
fun show(title: String, message: String, listener: (r : ResponseType) -> Unit) {
val builder = AlertDialog.Builder(context)
builder.setTitle(title)
builder.setMessage(message)
builder.setIcon(android.R.drawable.ic_dialog_alert)
onResponse = listener
// performing positive action
builder.setPositiveButton("Yes") { _, _ ->
onResponse(ResponseType.YES)
}
// performing negative action
builder.setNegativeButton("No") { _, _ ->
onResponse(ResponseType.NO)
}
// Create the AlertDialog
val alertDialog: AlertDialog = builder.create()
// Set other dialog properties
alertDialog.setCancelable(false)
alertDialog.show()
}
}
事实上,我们也可以为 CANCEL 按钮调用 onResponse。例如,现在在 MainActivity 的某个地方,您可以编写如下内容:
科特林
CustomDialog(context).show(getString(R.string.alert_title),
getString(R.string.are_you_sure)) {
Toast.makeText(applicationContext,
it.toString(),
Toast.LENGTH_LONG).show()
}
输出:
事实上,您可以使用 XML 布局自定义更多内容。也可以在对话框中提供 TextView 甚至 Spinner。