Understanding Android: gli OptionsMenu [Parte 1]

Diego Stamigni

Buongiorno signori,

Oggi cercheremo di capire come scrivere un menu in un’applicazione Android, e più precisamente come creare un OptionMenu.

Cosa sono gli OptionsMenu ? Bene, gli OptionsMenu sono quei menu che appaiono quando, in un’applicazione, premete il tasto Menu sul vostro smartphone.

Non è complesso creare un menu di quel tipo, settare le icone, impostare degli Intent o altro, ma andiamo a vedere più nel dettaglio di cosa stiamo parlando.

Android ci mette a disposizione, nel package android.view, delle interfacce per gestire i Menu, con annessi metodi per la loro creazione. In realtà sono metodi sui quali va effettuato un’override, e quindi una riscrittura, per permetterne l’implementazione.

Immaginiamo di avere un progetto che deve mostrare un menu come quello in figura (sopra). Come si fa ? Nel codice dell’Activity principale abbiamo l’ormai noto onCreate() che viene richiamato ogni volta che si ha un’instanza dell’Activity principale e, di fatto, fuori da questo metodo è possibile specificare diverse funzionalità da Overridare, come la creazione di un OptionMenu.

Di default questo menu c’è, ma è praticamente vuoto, per cui dobbiamo implementarlo, quindi riempirlo. Per fare questo Android ci mette a disposizione un metodo boolean (vedremo perchè boolean):

public boolean onCreateOptionMenu(Menu menu)

che, come parametro, ha proprio il riferimento al nostro menu. In questo metodo è possibile specificare quali campi avere, con quali labels, in quale ordine, che icone assegnare a ogni campo, e via dicendo.

Per fare ciò si utilizzano i diversi metodi che abbiamo a disposizione nel package android.view:

public abstract MenuItem add (int groupdId, int itemId, int order, int titleRes)
public abstract MenuItem setIcon (Drawable icon)
public abstract MenuItem setIcon (int iconRes)
public abstract MenuItem setCheckable (boolean checkable)

Questi metodo, rispettivamente, permettono di aggiungere un’item al menu, di impostargli l’icona ottenuta da un riferimento attraverso la classe R o da un Drawable, impostare lo stato di un’item se checked o meno (vedremo cosa vuol dire).

Il costruttore di un singolo item contiene diversi parametri, int groupdId, int itemId, int order, CharSequence titleRes, questi indicano rispettivamente l’id del gruppo di items, l’id del singolo item, l’ordine di posizionamento e una sequenza di caratteri per la label, quindi COSA visualizzare.

La curiosità sta nel fatto che abbiamo un limite di 6 item per i nostri OptionMenu e nel caso questo limite venga superato, viene automaticamente implementato un tasto More (Vedi figura sopra) che racchiuderà gli altri item presenti ma non visibili. Vediamo un’esempio:

[…]

public boolean onCreateOptionsMenu(Menu menu) {
// prendiamo gli eventuali MenuItem di sistema presenti
// se non ce ne sono, non prendiamo nulla dalla superclasse
super.onCreateOptionsMenu(menu);

// ordine iniziale, che incrementeremo
// FIRST è un valore statico, inizializzato a 1
int order = Menu.FIRST;

// Creiamo il primo gruppo di MenuItem
int FIRST_GROUP = 0;
menu.add(FIRST_GROUP, 0, order++, "View").setIcon(R.drawable.viewicon);

menu.add(FIRST_GROUP, 1, order++, "Upload").setIcon(R.drawable.uploadicon);

menu.add(FIRST_GROUP, 2, order++, "Send").setIcon(R.drawable.sendicon);

// creiamo il secondo gruppo di MenuItem
int SECOND_GROUP = 1;
menu.add(SECOND_GROUP, 3, order++, "Search").setIcon(R.drawable.searchicon);

menu.add(SECOND_GROUP, 4, order++, "Settings").setIcon(R.drawable.settingsicon);

menu.add(SECOND_GROUP, 5, order++, "SonoNelMore(1)");

// Creiamo il terzo gruppo
int THIRD_GROUP = 2;
menu.add(THIRD_GROUP, 6, order++, "SonoNelMore(2)");

menu.add(THIRD_GROUP, 7, order++, "SonoNelMore(3)").setCheckable(true);

menu.add(THIRD_GROUP, 8, order++, "SonoNelMore(4)").setIcon(R.drawable.icon);

return true;
}

Notiamo la semplicità di creazione del menu, e di fatto, come potrete constatare testando il codice, gli items identificati con itemId di dominio [5, 8] saranno visualizzati nel tasto More che noi NON abbiamo implementato: Android si è quindi preoccupato di sistemare gli items in eccesso in una list (chiamata expanded menu) accessibile dall’ormai citato tasto More.

Inoltre osserviamo anche come nell’item 7 sia stato impostato lo stato di checkabile su true, cioè è possibile selezione l’elemento come un’opzione: apparirà quindi a destra del Label una casella che sarà possibile selezionare.

Il metodo onCreateOptionsMenu() è un booleano, e per questo motivo è importante capire cosa ritornare: se ritorniamo false, il menu NON sarà visualizzato, viceversa se ritorniamo true. Nella documentazione ufficiale è infatti menzionata questa cosa:

Returns

  • You must return true for the menu to be displayed; if you return false it will not be shown.

E’ chiaro come non abbiamo scritto alcun metodo che operi quando un’item viene selezionato e quindi clickato. In effetti per capire quale degli item è stato selezionato e fare operazioni sarà argomento della Parte 2 di questo articolo.

Vedremo che ci sono diversi modi per fare questo, e che è inoltre possibile operare pensando a ottimizzare in termini di prestazioni. Alla prossima!