Ejemplo de como mostrar un cuadro de diálogo de alerta simple en Kotlin

fun showDialogAlertSimple() {
AlertDialog.Builder(this)
.setTitle("Titulo del diálogo")
.setMessage("Contenido del diálogo.")
.setPositiveButton(android.R.string.ok,
DialogInterface.OnClickListener { dialog, which ->
//botón OK pulsado
})
.setNegativeButton(android.R.string.cancel,
DialogInterface.OnClickListener { dialog, which ->
//botón cancel pulsado
})
.show()
}
Si no se especifica lo contrario para salir del diálogo el usuario puede pulsar la zona opaca, si queremos evitar eso se debe usar la propiedad: setCancelable() estableciendo el valor false
...
.setCancelable(false)
.show()
Dialogo permanente al rotar la vista
Por defecto el dialogo al rotar la vista se cierra, para mantener el dialogo permanente al rotar el dispositivo, lo debemos crear y llamar dentro de un DialogFragment
class SimpleAlertDialog : DialogFragment() {
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
return activity?.let {
val title = "Titulo del diálogo"
val content = "Contenido del diálogo."
val builder: AlertDialog.Builder = AlertDialog.Builder(requireActivity())
builder.setTitle(title).setMessage(content)
.setPositiveButton(android.R.string.ok) { _, _ ->
//Todo OK click
}
.setNegativeButton(android.R.string.cancel) { _, _ ->
//Todo Cancle click
}
return builder.create()
} ?: throw IllegalStateException("Activity cannot be null")
}
}
Su llamada des de un Activity
val modalDialog = SimpleAlertDialog()
modalDialog.show(supportFragmentManager, "confirmDialog")
Mostrar el dialogo desde un Fragment
val modalDialog = SimpleAlertDialog()
modalDialog.show(requireActivity().supportFragmentManager, "confirmDialog")
Cómo pasar eventos a la Actividad
Si queremos propagar un evento del dialogo, pulsación de botones, selección de elementos etc.. deberemos usar un CallBack para el retorno del evento y en la Activity interceptar el evento con un Listener.
En el DialogFragment añadir la interface con los eventos
class SimpleAlertDialog : DialogFragment() {
...
interface OnContinueCancelClickListener {
fun onPositiveClick()
fun onCancelClick()
}
...
builder.setTitle(title).setMessage(content)
.setPositiveButton(android.R.string.ok) { _, _ ->
val listener = activity as OnContinueCancelClickListener?
listener!!.onPositiveClick()
}
.setNegativeButton(android.R.string.cancel) { _, _ ->
val listener = activity as OnContinueCancelClickListener?
listener!!.onCancelClick()
}
Y en la actividad añadir el Listener
class MainActivity : AppCompatActivity(), OnContinueCancelClickListener {
...
override fun onPositiveClick() {
toast("ok button")
}
override fun onCancelClick() {
toast("cancel button")
}
}