Ovviamente una AlertDialog strutturata come quella del capitolo precedente non è molto utile in quanto non presenta alcun bottone e di fatto blocca l’applicazione in quanto non c’è modo di rimuoverla dallo schermo. Prima di aggiungere dei bottoni all’AlertDialog, però, è necessario aggiungere un oggetto TextView nel quale andremo a scrivere un messaggio diverso a seconda del bottone cliccato dall’utente. L’aggiunta del campo TextView viene lasciato per esercizio al lettore.
Per l’aggiunta dei bottoni alla AlertDialog e per l’associazione dei listener è sufficiente sostituire il codice scritto nel capitolo precedente con il seguente:
AlertDialog.Builder miaAlert = new AlertDialog.Builder(this);
miaAlert.setMessage("Verifichiamo il funzionamento dei bottoni aggiunti!");
miaAlert.setTitle("AlertDialog di MrWebMaster");
miaAlert.setCancelable(false);
miaAlert.setPositiveButton("Si", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
tv.setText("Ho cliccato il tasto SI");
}
});
miaAlert.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
tv.setText("Ho cliccato il tasto NO");
}
});
AlertDialog alert = miaAlert.create();
alert.show();
Per quanto riguarda la prime tre righe di codice non è necessario spiegare niente in quanto sono identiche a quelle mostrate nel capitolo precedente. Andando avanti con l’analisi del codice troviamo l’invocazione del metodo setCanceble(false) che ha l’effetto di disabilitare il tasto back del telefono e dunque l’utente dovrà necessariamente cliccare su uno dei due bottoni per chiudere l’AlertDialog.
Detto questo passiamo alla creazione dei bottoni veri e propri. Il primo bottone viene creato con il metodo setPositiveButton il quale prende in ingresso una stringa che verrà mostrata a schermo come contenuto del bottone e un listener. Come possiamo vedere il listener viene dichiarato come nuova istanza di DialogInterface.OnClickListener e non come nuova istanza di View.OnClickListener. Quest’ultimo infatti può essere applicato solamente ad elementi che eriditano la classe View e dato che le AlertDialog non ereditano questa classe, ma fanno parte del package android.app, è necessario utilizzare un listener di tipo DialogInterface.
All’atto pratico questa differenza non è sostanzianziale, infatti, anche in questo caso, sarà necessario ridefinire il metodo OnClick ed inserirvi il codice relativo al comportamento che vogliamo dare ai due bottoni. Come possiamo vedere il metodo OnClick prende in ingresso due parametri: il primo è un oggetto di tipo AlertDialog (che ci indica quale dialog ha generato l’attivazione del listener) e poi un id che identifica il bottone premuto. All’interno del metodo OnClick semplicemente andiamo a cambiare il testo relativo alla TextView tv.
La struttura del metodo OnClick ci suggerisce una versione ottimizzata del nostro listener. Infatti sapendo quale AlertDialog ha attivato il listener e quale bottone all’interno della alert è stata cliccato sarà possibile creare un un unico listener per gestire più AlertDialog ed i relativi bottoni. Ciò si realizza semplicemente eseguendo un primo switch sull’attributo Dialog (andiamo ad identificare quale AlertDialog ha attivato il listener) ed in ogni case relativo alle AlertDialog inserire all’interno un altro switch per capire quale bottone, relativo alla AlertDialog presa in esame, è stato cliccato.
Si lascia per esercizio al lettore questa nuova implementazione del listener che sostanzialmente è molto simile a quella vista nei capitoli precedenti di questa guida.