Android Lezione 5 – Il Context Menu

In questa lezione introduciamo un nuovo oggetto dell’interfaccia di Android: il Context Menu.

Si tratta di uno dei menu messi a disposizione dal sistema android, e viene chiamato quando l’utente tocca per qualche secondo una View, per la quale è stato registrato un oggetto appunto di tipo Context Menu.

Questo menu può essere utilizzato in vari contesti, per esempio si potrebbero voler mostrare delle opzioni se un utente tiene premuto il dito su una casella di testo, magari mostrando un elenco di opzioni disponibili, oppure durante la visualizzazione di un immagine per mostrare delle opzioni relative ad essa, etc.

Passiamo ora a vedere come implementarlo. Per riempire le voci del menu sono disponibili diverse modalità, in questa guida vedremo principalmente quella basata sul file xml. Se state seguendo i tutorial aprite il progetto ItalialinuxExample che abbiamo iniziato durante le lezioni precedenti, altrimenti potete scaricarlo da qua

Prima di tutto (per comodità) creiamo una cartella “menu” all’interno di res:

Qui andremo a mettere tutti i file xml relativi alle voci di menu. Ogni file indicherà un menù. Quindi creiamo un nuovo menu, clickando col destro sul folder appena creato selezionando: New -> Android XML File. Si aprirà una schermata simile alla seguente:

Diamo un nome al File e selezioniamo come tipo: Menu. Nell’esempio il file avrà come nome example(.xml). Premiamo Finish. Si apre così la schermata per editare i file xml (in questo caso i menù). Il file può essere editato in due modi:

1. Editando direttamente il sorgente

2. Utilizzando l’interfaccia messa a disposizione da eclipse.

Noi utilizzeremo direttamente il secondo metodo, mostrando poi il risultato finale dell’XML. Andiamo quindi a ad aggiungere tre elementi al nostro file menu:

  1. TestItemUno
  2. TestItemDue
  3. TestItemTre

Per farlo premiamo il pulsante add, si aprirà la seguente finestra:

In questo caso, dovendo inserire un elemento del menu selezioniamo Item e diamo Ok

Si aggiungerà un elemento, e ora verranno mostrate tutte le proprietà disponibile, in questo caso a noi interessa modificare solo due proprietà:  id, e Title. Come id mettiamo itemuno_id e come Title: TestItemUno.

Ripetiamo la stessa operazione anche per gli altri due elementi e salviamo. Così avremo il nostro menu bello e pronto da essere inserito nel ContextMenu. Il risultato finale visto dall’xml sará il seguente:

<?xml version="1.0" encoding="utf-8">
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:title="TestItemUno" android:id="@+id/itemuno_id"></item>;
<item android:title="TestItemDue" android:id="@+id/itemdue_id"></item>
<item android:title="TestItemTre" android:id="@+id/itemtre_id"></item>
</menu>

A questo punto siamo pronti per caricare il nostro menu. Prendiamo la nostra Activity, FirstActivity e iniziamo con l’aggiungere gli import necessari (lo so che Eclipse ci aiuta in tutto e ce li inserisce per noi, ma ritengo che sia meglio comunque metterli a mano almeno le prime volte 😀 )

import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.MenuInflater;

A questo punto associamo il ContextMenu alla nostra TextView, utilizzando il metodo:

registerForContextMenu(View view);

Che serve appunto ad associare un Context menu con una View. Quindi nel nostro esempio la chiamata diventerá:

registerForContextMenu(localText);

Dove ricordo che localText era la TextView creata nelle lezioni precedenti, e ovviamente questa chiamata andrá messa dopo l’inizializzazione e dichiarazione della TextView.

A questo punto dobbiamo creare il metodo onCreateContextMenu:

    public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo){
    	super.onCreateContextMenu(menu, v, menuInfo);
    	MenuInflater myMenu = getMenuInflater();
    	myMenu.inflate(R.menu.example, menu);
    }

Spieghiamo linea per linea:

  • La prima linea chiama il metodo onCreateContextMenu della classe padre
  • La seconda linea dichiara un oggetto MenuInflater necessario per istanziare un file xml del menu all’interno di un oggetto Menu.
  • Con la terza linea chiamiamo il metodo inflate dell’oggetto appena creato, che carica il menu dichiarato in R.menu.example all’interno del ContextMenu “menu” (Con R.menu.example ci riferiamo appunto al file example.xml)

Ora se lanciamo l’applicazione e proviamo a tenere il dito sul testo della TextView  (ricordo che questo articolo é  basato sulle lezioni precedenti) gia vediamo che il menu compare correttamente.

Ovviamente non abbiamo terminato, in quanto dobbiamo anche associare delle azioni ad ogni elemento del menu, in questo esempio faremo apparire un messagio che stampa il nome del menu selezionato. La gestione della selezione é gestita dal metodo:  onContextItemSelected, che andrá quindi implementato nella nostra classe, nel nostro esempio sará:

    public boolean onContextItemSelected(MenuItem item) {
        Toast.makeText(this, item.getTitle(), Toast.LENGTH_SHORT).show();
        return true;
    }

Questo metodo viene chiamato ogni volta che si seleziona una voce del menu. E l’oggetto Item contiene le informazioni relative alla voce di menu selezionata. come si puo facilmente intuire con:

item.getTitle();

Serve per prendere il campo title della voce del menu.
Mentre con:

        Toast.makeText(this, item.getTitle(), Toast.LENGTH_SHORT).show();

Questa linea di codice invece, stampa sullo schermo il titolo dell’elemento selezionato. Per utilizzarla dovete aggiungere il seguente import:

import android.widget.Toast;

Con questo penso sia tutto.
Per scaricare i sorgenti di questa lezione andate qua.

3 thoughts on “Android Lezione 5 – Il Context Menu”

  1. Ciao,

    Bel tutorial, ma ora ho la necessità di inserire 2 ContextMenu, ho creato un altro menu con nome diverso, ho fatto tutto quello che indica la guida, registro anche il secondo button sotto registerForContextMenu, ma anche se in myMenu.inflate(R.menu.example, menu); inserisco il nome del secondo menu, entrambi i button aprono il primo menu.

    In automatico, Eclipse ha rinominato onCreateContextMenu in onCreateContextMenu1

    Potrei sapere come risolvere?
    Grazie.

    1. Non devi creare altre onCreateContextMenu, ma se i due contextmenu sono associati a dei bottoni, ti basta in fase di creazione del menu vedere di che bottone si tratta.
      Io ho risolto cosí:

      public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo){
      super.onCreateContextMenu(menu, v, menuInfo);
      MenuInflater inflater = getMenuInflater();
      if(this.curBtn == this.btn4Id)
      inflater.inflate(R.menu.tolerancemenu, menu);
      else
      inflater.inflate(R.menu.colormenu, menu);
      }

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.