📌  相关文章
📜  如何使用 Kotlin 在 Android 中创建自定义是/否对话框?

📅  最后修改于: 2022-05-13 01:54:23.577000             🧑  作者: Mango

如何使用 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。