Nei capitoli precedenti abbiamo analizzato approfonditamente il menu di tipo IconMenu che è, generalmente, il più utilizzato. Altra risorsa che Android ci offre è il ContextMenu che può essere accomunato, come struttura e funzionamento, al menù che appare cliccando con il tasto destro del mouse su una qualsiasi icona di Windows.
Il ContextMenu infatti non viene mostrato all’utente in seguito ad una pressione di un tasto sul dispositivo (come invece lo era per gli IconMenu), ma viene associato ad un determinato elemento e viene mostrato all’utente in seguito ad un click prolungato proprio su quell’elemento.
Ovviamente, all’interno di un’activity, è possibile creare dei ContextMenu diversi per poi associarli a elementi diversi, oppure creare un unico ContextMenu ed associarlo a più elementi diversi.
Andiamo adesso a mostrare il codice necessario a creare due diversi ContextMenu per poi associarne uno ad un bottone ed un altro ad una TextView (prima di inserire il codice è necessario importare il pacchetto android.view.ContextMenu.*):
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout mioLayout = new LinearLayout(this);
Button bottone = new Button(this);
bottone.setId(1);
button1.setText("Bottone associato ad un menù");
TextView tv = new TextView(this);
tv.setText("Fai un click prolungato per il contextmenu");
tv.setId(2);
mioLayout.addView(bottone);
mioLayout.addView(tv);
setContentView(layout);
registerForContextMenu(bottone);
registerForContextMenu(tv);
}
public void onCreateContextMenu(ContextMenu contextMenu, View view, ContextMenuInfo menuInfo) {
if(view.getId() == 1) {
menu.setHeaderTitle("ContextMenu del bottone");
menu.add(Menu.NONE, 1, 1, "Voce bottone 1");
menu.add(Menu.NONE, 2, 2, "Voce bottone 2");
}
else if(view.getId() == 2) {
menu.setHeaderTitle("ContextMenu della TextView");
menu.add(Menu.NONE, 3, 1, "Voce TextView 1");
menu.add(Menu.NONE, 4, 2, "Voce TextView 2");
}
}
Facciamo l’analisi del codice proposto. Per quanto riguarda il contenuto del metodo onCreate le uniche linee di codice mai viste sono quelle relative all’invocazione del metodo registerForContextMenu che associa all’elemento passato come parametro un eventuale ContextMenu.
Di maggiore interesse risulta invece il metodo onCreateContextMenu che, di fatto, contiene il codice relativo ai ContextMenu che vogliamo creare. Anche in questo caso, per creare un diverso menù per i due elementi, abbiamo utilizzato il metodo getId() della view che ha richiamato il metodo onCreateContextMenu (il settaggio dell’id dei due elementi viene eseguito nel metodo onCreate utilizzando setId()).
All’interno degli if andiamo ad aggiungere al menu le voci che desideriamo con il solito metodo add ed utlizziamo il metodo setHeaderTitle per impostare un titolo al ContextMenu.
Per poter associare un comportamento specifico alla pressione di uno dei tasti del menù si opera nella stessa maniera vista nel capitolo precedente per gli OptionMenu, inserendo però il codice desiderato all’interno del metodo onContextItemSelected(MenuItem item).