Los menús en las aplicaciones son algo que encontramos frecuentemente, de hecho, casi todos los terminales Android tienen un botón específico para desplegarlos.

Se dispone de distintos tipo de menús:

Índice

Options Menu



Lo más simple y sencillo es definir los menús en XML, colocado en ./res/menu, para este ejemplo he definido el siguiente menu, que contiene dos elementos, un About y un Quit:

<?xml version="1.0" encoding="utf­8"?>
<menu
  xmlns:android="http://schemas.android.com/apk/res/android">
    <item 
        android:id="@+id/about" 
        android:icon="@drawable/about"
        android:title="About App">
        <menu xmlns:android="http://schemas.android.com/apk/res/android">
            <item 
                android:id="@+id/submenu" 
                android:title="Submenú de &quot;About App&quot;"/>
        </menu>
    </item>
    <item 
        android:id="@+id/quit"
        android:title="Quit App" 
        android:icon="@drawable/quit"/>
</menu>

Bien, voy a explicar un poco la estructura de este menú, Empezamos declarando el menú con la etiqueta <menu>, que contendrá todos sus elementos bajo la etiqueta <item>, en este caso, también tenemos un submenu, que se declara igual que el menú principal.

Los atributos de cada elemento son su identificador, el icono a mostrar y el título.

Para poder usar este menú, necesitamos inflarlo (Convertir el fichero XML en un objeto java), para hacer esto, hay que llamar a MenuInflater.inflate(), el código siguiente infla el fichero xml anterior en el método callback onCreateOptionsMenu().

@Override
public boolean onCreateOptionsMenu(Menu menu) {
   MenuInflater inflater = getMenuInflater();
   inflater.inflate(R.menu.ejemplo_menu, menu);
   return true;
}

Ahora, tenemos que responder a las acciones del usuario cuando pulse algún elemento de nuestro menú, para ello vamos a sobreescribir el método onOptionsItemSelected()

@Override
public boolean onOptionsItemSelected(MenuItem item) {
   switch (item.getItemId()) {
   case R.id.about:
      Toast.makeText(
            MenusActivity.this
           ,"Ejemplo Menús App"
           ,Toast.LENGTH_LONG)
           .show();
      return true;
   
   case R.id.quit:
      finish();
      return true;
      
   default:
      return super.onOptionsItemSelected(item);
   }
}

Context Menu

Los menús contextuales son similares a los menús mostrados al hacer click con el botón derecho de un ratón en un PC, para crearlos, debemos sobreescribir el método onCreateContextMenu(), donde inflaremos el archivo xml.

@Override
public void onCreateContextMenu(ContextMenu menu, View v,
      ContextMenuInfo menuInfo) {
   super.onCreateContextMenu(menu, v, menuInfo);
   MenuInflater inflater = getMenuInflater();
   inflater.inflate(R.menu.ejemplo_menu, menu);
}

Al igual que en los options menu, tenemos que responder a las acciones del usuario:

@Override
public boolean onContextItemSelected(MenuItem item) {
   switch (item.getItemId()) {
   case R.id.about:
      Toast.makeText(
            MenusActivity.this
           ,"Ejemplo Menús App"
           ,Toast.LENGTH_LONG)
           .show();
      return true;
      
   case R.id.quit:
      finish();
      return true;
      
   default:
      return super.onOptionsItemSelected(item);
   }
}

Pero este menú contextual no se va a mostrar, ya que tenemos que asociarlo para que se lanze al realizar una pulsación prolongada sobre una view, en este caso un botón:

final Button boton = (Button) findViewById(R.id.button1);
registerForContextMenu(boton);

Aquí dejo algunas capturas de pantalla de la aplicación:

Podéis encontrar más información sobre Menús en la página oficial de Android

Espero que os sirva de ayuda.

Siguiente Tema: Programación Android: Interfaz gráfica - Diálogos y notificaciones