Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 20 di 97
  • livello avanzato
Indice lezioni

Notifiche: Toast e Dialog

Come gestire la visualizzazione delle notifiche: toast e dialog.
Come gestire la visualizzazione delle notifiche: toast e dialog.
Link copiato negli appunti

Una delle fasi più comuni dell'interazione app-utente è la notifica di messaggi mediante le cosiddette finestre di dialogo. Tra l'altro, la presenza costante delle AlertBox, MessageBox e dialog nelle diverse tecnologie web e desktop di ogni epoca ha reso questa forma di comunicazione particolarmente familiare all'utente.

Toast

Utilizzando un dispositivo Android, una tipologia di notifica che si incontra presto è il cosiddetto Toast. Si tratta di una piccola area che appare nella parte bassa del display contenente un messaggio. La sua visibilità dura poco, qualche secondo, e le sue apparizioni improvvise dal basso gli hanno donato questo nome che richiama letteralmente il modo in cui il pane salta fuori dai tostapane.

Il Toast è la forma di notifica più immediata che esiste e realizzarlo è molto semplice:

Toast.makeText(this, "Ciao a tutti!", Toast.LENGTH_SHORT).show();

Si fa uso della classe omonima che espone un metodo statico makeText che prepara il messaggio. I tre parametri richiesti sono:

  • un riferimento al Context dell'app. In questo caso, come spesso avviene, si risolve passando un riferimento this all'Activity stessa;
  • il testo che si vuole mostrare. Ovviamente sarebbe il caso di sostituirlo con apposite risorse stringa;
  • la durata del messaggio utilizzando come valori uno di quelli messi a disposizione delle costanti della classe Toast: LENGTH_LONG e LENGTH_SHORT.

Da non dimenticare, l'invocazione del metodo show() senza la quale il Toast non apparirà.

Il risultato è visibile in figura:

Il Toast risulta pertanto una forma di notifica molto comunicativa, ma l'impossibilità di configurarlo in tutti i suoi aspetti lo limita pesantemente. In alternativa, a partire dal Android 5.0, si è affermata la SnackBar, sempre più diffusa nelle interfacce Android: un elemento ugualmente intuitivo ma più configurabile, quasi una via di mezzo tra il Toast e le finestre di dialogo.

Le Dialog

Immediatezza comunicativa e rapidità di implementazione sono i vantaggi principali del Toast ma ciò che offre spesso non basta. Arriva presto il momento di utilizzare delle vere finestre di dialogo.

Android offre la possibilità di avere Dialog grezze da configurare o in alternativa alcuni tipi già pronti che rispecchiano gli utilizzi più comuni: AlertDialog per gli avvisi, ProgressDialog per mostrare barre di progresso ed altre ancora.

Dialog è la superclasse di tutte le finestre di dialogo e ne rappresenta il tipo più duttile ma che lascia più lavoro al programmatore. L'esempio seguente mostra codice che può essere eseguito all'interno di un metodo dell'Activity:

Dialog d=new Dialog(this);
d.setTitle("Login");
d.setCancelable(false);
d.setContentView(R.layout.dialog);
d.show();

Ciò che succede è descritto qui di seguito:

  • istanziamo un oggetto di classe Dialog passando un riferimento al Context;
  • impostiamo un titolo, già proprietà della finestra stessa;
  • definiamo la finestra come modale richiedendo la sua non-cancellabilità mediante setCancelable. Ciò impedirà che toccando il display al di fuori della finestra di dialogo essa si chiuda;
  • assegniamo un layout alla finestra di dialogo come faremmo per un'Activity. Il layout si trova nella cartella res/layout, rappresenta un form ed è lo stesso impiegato per i controlli utente;
  • ultimo ma non meno importante, invochiamo il metodo show() senza il quale la finestra di dialogo non apparirà.

Questo il risultato:

Il click sui pulsanti sarà gestito mediante click listener. Allo scopo è importante dotare, nel layout, i pulsanti di appositi id. Immaginando che il pulsante con l'etichetta “Login” abbia come id R.id.login:

final Dialog d=new Dialog(this);
/*
* OMISSIS: configurazioni varie della finestra di dialogo come le precedenti
* */
Button b = d.findViewById(R.id.login);
b.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View arg0)
{
Toast.makeText(d.getContext(), "cliccato", Toast.LENGTH_LONG).show();
}
});
d.show();

L'utilizzo del codice non stupisce ma si notino comunque due particolarità:

  • il Context necessario nel Toast è stato recuperato dal Dialog stesso;
  • il Dialog dichiarato, a differenza dello snippet precedente, è stato etichettato come final in quanto, per una regola propria del linguaggio Java, dichiarato nello stesso metodo in cui viene istanziato l'oggetto anonimo che lo usa.

Dialog già “pronte”

Come si è visto, l'uso della classe Dialog non è proibitivo ma richiede comunque alcune operazioni. Parallelamente, Android offre tipi di finestre di dialogo, molto comuni, praticamente pronte all'uso.

I principali:

  • AlertDialog: la più adattabile. Sfrutta una classe interna detta Builder per configurare i vari aspetti:
    AlertDialog.Builder builder=new AlertDialog.Builder(this);
    builder.setTitle("Attenzione!");
    builder.setMessage("Operazione non valida!");
    builder.show();
    L'esempio di codice porta alla realizzazione di una finestra di dialogo che semplicemente mostra un titolo ed un messaggio: praticamente una normalissima AlertBox. AlertDialog inoltre ha già tre pulsanti innestati denominati PositiveButton, NegativeButton e NeutralButton per i quali è necessario solo definire le azioni di gestione del click. Infine piuttosto che richiamare lo show direttamente sul Builder, come mostrato, si può ottenere un riferimento alla finestra di dialogo prodotta tramite il metodo createDialog.
  • ProgressDialog è un derivato della AlertDialog pensato per lo più per ospitare indicatori di progresso sia in stile orizzontale (barra) che spinner (circolare). Può essere utilizzato in maniera molto agevole grazie alla versione statica del metodo show:
    ProgressDialog progress = ProgressDialog.show(this, "Attendere", "Scaricamento in corso...", true);

    Va tuttavia ricordato che tale tipologia di finestra è deprecata a partire dalle API di livello 26. Per analoghe necessità, è preferibile
    innestare una ProgressBar nel layout dell'Activity.
  • DatePickerDialog e TimePickerDialog, specializzati nella selezione di date e orari, mostrano controlli adatti e opportuni metodi per impostare le informazioni temporali oltre che rilevare gli eventi di selezione.

Ti consigliamo anche