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
- Context Menu
l'impiego della Contexual Action Bar -
Popup menu
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>
<item>
- id
- title
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()
inflater.inflate(R.menu.main,menu)
inflatingreturn true
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
onCreateOptionsMenu
- definizione delle azioni di risposta al click sulle voci mediante
onContextItemSelected
- effettuazione di un'operazione molto importante che non è , viceversa, usata negli OptionsMenu
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
.