Android Alert Dialog utilizzando Kotlin

In questo tutorial, parleremo di Alert Dialog e li implementeremo nella nostra applicazione Android utilizzando Kotlin.

Alert Dialog

Alert Dialog è una finestra che compare sullo schermo. Di solito mostrano alcune informazioni e richiedono un’azione da parte dell’utente. Ci sono tre componenti principali che compongono un Alert Dialog.

  • Testo del titolo
  • Testo del messaggio
  • Pulsanti – Ci sono tre tipi di pulsanti: Positivo, Negativo e Neutro

Per creare un AlertDialog utilizziamo la classe interna AlertDialog.Builder.

val alertDialogBuilder = AlertDialog.Builder(this)

Passiamo il contesto nel costruttore. Opzionalmente, possiamo passare un altro parametro, lo stile della finestra di dialogo.

Metodi di Alert Dialog

Alcuni dei metodi che possono essere utilizzati su un AlertDialog.

  • setTitle
  • setMessage
  • setIcon
  • setCustomTitle – Qui è possibile passare una vista personalizzata che verrà inserita al posto della parte del titolo nella finestra di dialogo.
  • setPositiveButton – Passiamo il nome della stringa, così come il metodo di callback del pulsante cliccato.
  • setView – utilizzato per aggiungere una vista personalizzata all’interno della finestra di dialogo.
  • setList – utilizzato per impostare un array di stringhe che verranno visualizzate sotto forma di elenco.
  • setMultiChoiceList – di nuovo possiamo impostare un array, ma questa volta possiamo selezionare più elementi dall’elenco grazie alla CheckBox.
  • setPositiveButtonIcon – imposta un’icona accanto al pulsante.
  • show() – utilizzato per visualizzare l’AlertDialog.
  • setDismissListener – All’interno di questo, è possibile impostare la logica da attivare quando la finestra di dialogo viene chiusa.
  • setShowListener – imposta la logica da attivare quando la finestra di dialogo viene visualizzata.
  • setCancelable – richiede un valore booleano. Per impostazione predefinita, tutte le finestre di dialogo sono annullabili con un clic sul pulsante o toccando all’esterno. Se questo metodo viene impostato su false, è necessario annullare esplicitamente la finestra di dialogo utilizzando il metodo dialog.cancel().

Alert Dialog Kotlin Code

Per utilizzare AlertDialog nel tuo progetto Android Studio, importa la seguente classe.

import android.support.v7.app.AlertDialog;

Il seguente codice Kotlin viene utilizzato per creare una semplice finestra di dialogo.

val builder = AlertDialog.Builder(this)
builder.setTitle("Androidly Alert")
builder.setMessage("We have a message")

//builder.setPositiveButton("OK", DialogInterface.OnClickListener(function = x))

builder.setPositiveButton(android.R.string.yes) { dialog, which ->
    Toast.makeText(applicationContext,
            android.R.string.yes, Toast.LENGTH_SHORT).show()
}
        
builder.setNegativeButton(android.R.string.no) { dialog, which ->
    Toast.makeText(applicationContext,
            android.R.string.no, Toast.LENGTH_SHORT).show()
}

builder.setNeutralButton("Maybe") { dialog, which ->
    Toast.makeText(applicationContext,
            "Maybe", Toast.LENGTH_SHORT).show()
}
builder.show()

Il builder.show() mostra il dialogo di avviso sullo schermo. All’interno della funzione setPositiveButton, passiamo il testo del pulsante insieme a una funzione Kotlin che viene attivata quando quel pulsante viene cliccato. La funzione fa parte dell’interfaccia DialogInterface.OnClickListener(). Il tipo di funzione è (DialogInterface, Int) -> Unit. DialogInterface è un’istanza del dialogo e Int è l’ID del pulsante che viene cliccato. Nel codice sopra, abbiamo rappresentato questa funzione come una funzione Kotlin di ordine superiore. I parametri dialog e which rappresentano i due argomenti. Possiamo migliorare la funzione passando _ se gli argomenti non vengono utilizzati. Le funzioni avranno questo aspetto:

builder.setPositiveButton(android.R.string.yes) { _,_ ->
            Toast.makeText(applicationContext,
                    android.R.string.yes, Toast.LENGTH_SHORT).show()
        }

Alternativamente, possiamo anche mostrare il dialogo attraverso un’istanza della classe AlertDialog. Sostituisci builder.show() con:

val alertDialog = builder.create()
alertDialog.show()

Al posto di definire le funzioni listener per il clic del pulsante per ciascuno dei pulsanti, possiamo definire separatamente anche le funzioni di ordine superiore.

val positiveButtonClick = { dialog: DialogInterface, which: Int ->
    Toast.makeText(applicationContext,
            android.R.string.no, Toast.LENGTH_SHORT).show()
}

Ora impostiamo questa proprietà val all’interno della funzione Kotlin setPositiveButton come:

builder.setPositiveButton("OK", DialogInterface.OnClickListener(function = positiveButtonClick))
//or
builder.setPositiveButton(android.R.string.yes, positiveButtonClick)

Quest’ultimo rende il codice molto più conciso. Di seguito è riportata un’immagine della nostra classe Activity con la funzione precedente applicata per ciascuno dei pulsanti.

Puoi passare un valore nullo al posto della funzione se non intendi mantenere alcuna azione al clic del pulsante.

Kotlin ha ancora più potere per migliorare la leggibilità del codice sopra.

Codice Kotlin per un semplice dialogo di avviso

Utilizzando la funzione with, possiamo migliorare la leggibilità del codice Kotlin per creare un dialogo di avviso.

fun basicAlert(view: View){

        val builder = AlertDialog.Builder(this)
        
        with(builder)
        {
            setTitle("Androidly Alert")
            setMessage("We have a message")
            setPositiveButton("OK", DialogInterface.OnClickListener(function = positiveButtonClick))
            setNegativeButton(android.R.string.no, negativeButtonClick)
            setNeutralButton("Maybe", neutralButtonClick)
            show()    
        }
        
        
    }

Nella sezione successiva creeremo la nostra Applicazione Android dove implementeremo le seguenti funzionalità nel nostro AlertDialog.

  • Semplice dialogo di avviso
  • Dialogo di avviso con icona e personalizzazione del pulsante
  • Dialogo di avviso con lista
  • Dialogo di avviso con lista di scelte multiple
  • Dialogo di avviso con stile
  • Dialogo di avviso con stile personalizzato
  • Dialogo di avviso con EditText

Struttura del progetto Android Studio

1. Codice layout XML

Il codice per il layout activity_main.xml è riportato di seguito.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btnBasicAlert"
        android:layout_width="wrap_content"
        android:onClick="basicAlert"
        android:layout_height="wrap_content"
        android:text="BASIC ALERT DIALOG" />


    <Button
        android:id="@+id/btnAlertWithIconsAndCustomize"
        android:layout_width="wrap_content"
        android:onClick="withIconAndCustomise"
        android:layout_height="wrap_content"
        android:text="WITH ICON AND CUSTOMIZATION" />

    <Button
        android:id="@+id/btnAlertWithItems"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="withItems"
        android:text="WITH ITEMS" />

    <Button
        android:id="@+id/btnAlertWithMultiChoiceList"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="withMultiChoiceList"
        android:text="WITH MULTI CHOICE LIST" />

    <Button
        android:id="@+id/btnAlertWithStyle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="withStyle"
        android:text="WITH STYLE" />


    <Button
        android:id="@+id/btnAlertWithCustomStyle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="withCustomStyle"
        android:text="WITH CUSTOM STYLE" />

    <Button
        android:id="@+id/btnAlertWithButtonCentered"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="withButtonCentered"
        android:text="WITH BUTTON CENTERED" />

    <Button
        android:id="@+id/btnAlertWithEditText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="withEditText"
        android:text="WITH EDIT TEXT" />


</LinearLayout>

Per ciascuno dei pulsanti abbiamo impostato un attributo android:onClick con il nome della funzione. Queste funzioni Kotlin verranno attivate nella classe MainActivity.kt. Discuteremo ognuna di esse una alla volta.

2. Codice dell’attività principale di Kotlin

Abbiamo già creato il primo Alert Dialog sopra. Vediamo come appare il MainActivity.kt con esso.

package net.androidly.androidlyalertdialog

import android.content.DialogInterface
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.support.v7.app.AlertDialog
import android.view.View
import android.widget.Toast

class MainActivity : AppCompatActivity() {

    val positiveButtonClick = { dialog: DialogInterface, which: Int ->
        Toast.makeText(applicationContext,
                android.R.string.yes, Toast.LENGTH_SHORT).show()
    }
    val negativeButtonClick = { dialog: DialogInterface, which: Int ->
        Toast.makeText(applicationContext,
                android.R.string.no, Toast.LENGTH_SHORT).show()
    }
    val neutralButtonClick = { dialog: DialogInterface, which: Int ->
        Toast.makeText(applicationContext,
                "Maybe", Toast.LENGTH_SHORT).show()
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }

    fun basicAlert(view: View){

        val builder = AlertDialog.Builder(this)

        with(builder)
        {
            setTitle("Androidly Alert")
            setMessage("We have a message")
            setPositiveButton("OK", DialogInterface.OnClickListener(function = positiveButtonClick))
            setNegativeButton(android.R.string.no, negativeButtonClick)
            setNeutralButton("Maybe", neutralButtonClick)
            show()
        }


    }
}

3. Dialogo di avviso con icone e personalizzazione

val builder = AlertDialog.Builder(this)
        with(builder) {
            setTitle("Icon and Button Color")
            setMessage("We have a message")
            setPositiveButton("OK", null)
            setNegativeButton("CANCEL", null)
            setNeutralButton("NEUTRAL", null)
            setPositiveButtonIcon(resources.getDrawable(android.R.drawable.ic_menu_call, theme))
            setIcon(resources.getDrawable(android.R.drawable.ic_dialog_alert, theme))
        }
        val alertDialog = builder.create()
        alertDialog.show()

        val button = alertDialog.getButton(DialogInterface.BUTTON_POSITIVE)
        with(button) {
            setBackgroundColor(Color.BLACK)
            setPadding(0, 0, 20, 0)
            setTextColor(Color.WHITE)
        }

Utilizzando il getButton, possiamo recuperare uno qualsiasi dei pulsanti impostando la loro costante rispettiva. Una volta recuperato il pulsante, possiamo personalizzarlo come fatto sopra.

4. Dialogo di avviso con elementi

fun withItems(view: View) {

        val items = arrayOf("Red", "Orange", "Yellow", "Blue")
        val builder = AlertDialog.Builder(this)
        with(builder)
        {
            setTitle("List of Items")
            setItems(items) { dialog, which ->
                Toast.makeText(applicationContext, items[which] + " is clicked", Toast.LENGTH_SHORT).show()
            }

            setPositiveButton("OK", positiveButtonClick)
            show()
        }
    }

All’interno dei setItems passiamo l’array Kotlin. L’argomento which rappresenta l’indice dell’elemento cliccato nell’elenco.

5. Dialogo di avviso con elenco di scelte multiple

fun withMultiChoiceList(view: View) {

        val items = arrayOf("Microsoft", "Apple", "Amazon", "Google")
        val selectedList = ArrayList<Int>()
        val builder = AlertDialog.Builder(this)

        builder.setTitle("This is list choice dialog box")
        builder.setMultiChoiceItems(items, null
        ) { dialog, which, isChecked ->
            if (isChecked) {
                selectedList.add(which)
            } else if (selectedList.contains(which)) {
                selectedList.remove(Integer.valueOf(which))
            }
        }

        builder.setPositiveButton("DONE") { dialogInterface, i ->
            val selectedStrings = ArrayList<string>()

            for (j in selectedList.indices) {
                selectedStrings.add(items[selectedList[j]])
            }

            Toast.makeText(applicationContext, "Items selected are: " + Arrays.toString(selectedStrings.toTypedArray()), Toast.LENGTH_SHORT).show()
        }

        builder.show()

    }

Nel codice sopra, salviamo le scelte in un elenco di interi e le recuperiamo per mostrarle nuovamente nel messaggio Toast.

6. Finestra di dialogo di avviso con stile

fun withStyle(view: View) {

        val builder = AlertDialog.Builder(ContextThemeWrapper(this, android.R.style.Holo_SegmentedButton))

        with(builder)
        {
            setTitle("Androidly Alert")
            setMessage("We have a message")
            setPositiveButton("OK", DialogInterface.OnClickListener(function = positiveButtonClick))
            setNegativeButton(android.R.string.no, negativeButtonClick)
            setNeutralButton("Maybe", neutralButtonClick)
            show()
        }
    }

Se non si utilizza ContextThemeWrapper, la finestra di dialogo di avviso verrà visualizzata a schermo intero.

7. Finestra di dialogo di avviso con stile personalizzato

Aggiungi il seguente codice nel file styles.xml:

<style name="AlertDialogCustom" parent="@android:style/Theme.Material.Dialog">
        <item name="android:textColor">@android:color/white</item>
        <item name="android:textStyle">bold</item>
        <item name="android:headerDividersEnabled">true</item>
        <item name="android:background">@android:color/holo_blue_dark</item>
    </style>

Ecco la funzione Kotlin:

fun withCustomStyle(view: View) {

        val builder = AlertDialog.Builder(ContextThemeWrapper(this, R.style.AlertDialogCustom))

        with(builder)
        {
            setTitle("Androidly Alert")
            setMessage("We have a message")
            setPositiveButton("OK", DialogInterface.OnClickListener(function = positiveButtonClick))
            setNegativeButton(android.R.string.no, negativeButtonClick)
            setNeutralButton("Maybe", neutralButtonClick)
            show()
        }

    }

8. Finestra di dialogo di avviso con pulsante centrato

fun withButtonCentered(view: View) {

        val alertDialog = AlertDialog.Builder(this).create()
        alertDialog.setTitle("Title")
        alertDialog.setMessage("Message")

        alertDialog.setButton(AlertDialog.BUTTON_POSITIVE, "Yes"
        ) { dialog, which -> dialog.dismiss() }

        alertDialog.setButton(AlertDialog.BUTTON_NEGATIVE, "No"
        ) { dialog, which -> dialog.dismiss() }
        alertDialog.show()

        val btnPositive = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE)
        val btnNegative = alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE)

        val layoutParams = btnPositive.layoutParams as LinearLayout.LayoutParams
        layoutParams.weight = 10f
        btnPositive.layoutParams = layoutParams
        btnNegative.layoutParams = layoutParams
    }

9. Finestra di dialogo di avviso con campo di modifica del testo

Il codice per il layout personalizzato alert_dialog_with_edittext.xml è fornito di seguito:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <EditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Enter the text here"/>

</LinearLayout>
fun withEditText(view: View) {
        val builder = AlertDialog.Builder(this)
        val inflater = layoutInflater
        builder.setTitle("With EditText")
        val dialogLayout = inflater.inflate(R.layout.alert_dialog_with_edittext, null)
        val editText  = dialogLayout.findViewById<EditText>(R.id.editText)
        builder.setView(dialogLayout)
        builder.setPositiveButton("OK") { dialogInterface, i -> Toast.makeText(applicationContext, "EditText is " + editText.text.toString(), Toast.LENGTH_SHORT).show() }
        builder.show()
    }

L’output dell’applicazione sopra indicata è il seguente:

Scarica il progetto Android Studio: AndroidlyAlertDialog

Source:
https://www.digitalocean.com/community/tutorials/android-alert-dialog-using-kotlin