Le applicazioni per Android fanno largo uso di menu per offrire un'interazione con l'utente più vicina a quella dei tradizionali programmi per desktop.
Le tipologie di menu più comuni in Android sono tre:
- Options menu: è il menu principale dell'applicazione e contiene voci riguardanti operazioni di interesse generale nella vita dell'app. Pensando ai programmi per desktop può essere paragonato al menu principale contenuto nella barra del titolo;
- Context Menu: è un menu invocabile su un singolo componente dell'interfaccia utente. Le voci richiamabili serviranno ad avviare operazioni sull'elemento su cui è stato richiesto il menu. Normalmente un menu contestuale viene attivato con un click lungo su un componente del layout. Ha le stesse finalità del menu che nei programmi per desktop viene richiamato con il classico “click” sul pulsante destro del mouse. Nell'evoluzione delle interfacce Android, questa tipologia di menu si è intrecciata strettamente con
l'impiego della Contexual Action Bar, anch'essa dedicata ad offrire azioni mirate a singoli oggetti; -
Popup menu: è un menu, ancorato ad un elemento dell'interfaccia utente, che permette di mostrare una lista
verticale di opzioni. Queste dovrebbero essere relative ad una parte specifica del contenuto senza comportarne la modifica, attività
per la quale sono più indicate le azioni contestuali di cui al punto precedente.
Definire la struttura del menu
Il primo passo per aggiungere un menu di qualsiasi tipo alla nostra Activity è crearne la struttura. In proposito, va sempre tenuto a mente che i menu sono risorse. Quindi il loro layout va definito nella sottocartella res/menu. Questo è il punto di partenza della creazione di un menu.
Il seguente codice mostra un layout di menu:
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/MENU_1"
android:title="Nuova nota"/>
<item
android:id="@+id/MENU_2"
android:title="Elenco note"/>
</menu
Assumiamo che il nome del file sia main.xml. Come si può vedere la sintassi necessaria non è molto articolata. Per poter creare un menu minimale, sono sufficienti due tag: <menu>
che definisce il menu nel suo complesso e <item>
che dichiara la singola voce del menu. Gli attributi impiegati nella configurazione sono due:
- id che, come vedremo, saranno molto importanti nella gestione delle voci del menu ;
- title che contiene una stringa che dà il titolo alla voce di menu.
Il risultato è visibile in figura:
Il menu apparirà cliccando sull'icona composta da tre puntini, che sarà visibile sulla barra dell'activity.
Attivare il menu nell'activity
Affinché il menu venga collegato all'Activity è necessario fare override di un metodo denominato onCreateOptionsMenu
. Quella che segue è l'implementazione utilizzata nell'esempio:
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
MenuInflater inflater=getMenuInflater();
inflater.inflate(R.menu.main,menu);
return true;
}
Questo metodo, richiesto nell'Activity che desidera il menu, prende come argomento un riferimento ad un oggetto Menu che non dovremo mai preoccuparci di istanziare in quanto sarà già preparato dal sistema. Ciò che resta da fare è configurarlo assegnandogli il layout che abbiamo predisposto nelle risorse. Questo sarà compito delle tre righe:
MenuInflater inflater=getMenuInflater()
: recupera un riferimento ad un inflater di Menu ossia un servizio del sistema in grado di modellare la struttura dell'oggetto Menu in base alle direttive impostate in XML;inflater.inflate(R.menu.main,menu)
: questo è il momento in cui l'azione dell'inflating viene veramente svolta. Il metodo inflate richiede due parametri: la risorsa contenente il layout del del menu e l'oggetto Menu da configurare;return true
: solo se il valore booleano restituito da onCreateOptionsMenu sarà true il menu sarà attivo.
Da ricordare che onCreateOptionsMenu
verrà invocato una sola volta, al momento della creazione del menu, cosa che avverrà contestualmente alla creazione dell'activity.
Gestire le voci del menu
Per poter usare il menu manca solo la gestione del click. Questo viene fatto mediante il metodo onOptionsItemSelected
.
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
int id=item.getItemId();
switch(id)
{
case R.id.MENU_1:
/*
Codice di gestione della voce MENU_1
*/
break;
case R.id.MENU_2:
/*
Codice di gestione della voce MENU_2
*/
}
return false;
}
Come si può vedere nello stralcio di codice, il parametro in input nel metodo è di classe MenuItem e rappresenta la singola voce selezionata. La prima cosa da fare è recuperare l'id della voce, così come è stato impostato nel menu ed in base al suo valore attivare la gestione corretta.
Creare un Context Menu
Finora la trattazione ha riguardato esclusivamente i menu Options. O almeno così sembra. In realtà i concetti finora espressi vengono applicati anche ai menu contestuali. Infatti un Context Menu viene creato in maniera del tutto simile ad un menu Options.
Le operazioni da effettuare sono le seguenti:
- definizione della struttura del menu contestuale in un apposito file della cartella res/menu;
- predisposizione del metodo
onCreateContextMenu
in cui verranno eseguite le medesime operazioni svolte nell'onCreateOptionsMenu
; - definizione delle azioni di risposta al click sulle voci mediante
onContextItemSelected
; - effettuazione di un'operazione molto importante che non è, viceversa, usata negli OptionsMenu: la registrazione dell'elemento che vuole usare il menu contestuale.
Visto che il menu contestuale viene richiamato con click lungo su un elemento del layout, si deve segnalare all'activity quale elemento sarà dotato di questa caratteristica. Per fare ciò si invoca il metodo registerForContextMenu(View v)
, solitamente nell'onCreate dell'activity, e la View che viene passata come parametro di ingresso è proprio il riferimento all'elemento sul quale può essere attivato il menu contestuale.
Probabilemente, la forma più comune di menu contestuale nelle app Android è la cosiddetta Contextual Action Bar, una barra temporanea che appare nella parte alta del layout per mostrare le opzioni attivabili sugli elementi selezionati.
Creare un PopupMenu
Anche il Popup Menu potrà essere aggiunto sulla falsa riga di quanto visto sinora. Prima di tutto, dovremo creare il metodo in
grado di farlo apparire. Potrebbe essere qualcosa del genere:
public void showPopup(View view) {
PopupMenu menu = new PopupMenu(this, view);
MenuInflater inflater = menu.getMenuInflater();
menu.setOnMenuItemClickListener(this);
inflater.inflate(R.menu.popup, menu.getMenu());
menu.show();
}
Anche in questo caso serve una risorsa menu, disegnata in XML, che verrà mostrata mediante inflater. Rispetto a quanto visto
prima il menu viene creato come oggetto di classe PopupMenu
e come argomento perviene un oggetto View
che sarà il controllo cui il menu è stato associato. Per attivare il menu, va collegato questo metodo ad un'azione di un elemento del'interfaccia, ad esempio, agganciandolo al suo click:
android:onClick="showPopup"
Per la gestione delle singole azioni, abbiamo richiamato il metodo setOnMenuItemClickListener
che imposta come listener
l'Activity stessa a patto che questa implementi l'interfaccia PopupMenu.OnMenuItemClickListener
con conseguente integrazione del
metodo onMenuItemClick(MenuItem item)
il cui funzionamento ricalca quello visto per onOptionsItemSelected
.