Desde la versión 3 de Android, los menús han sido relegados a un segundo plano en sustitución de la ActionBar. No obstante, siguen siendo una opción válida en muchas aplicaciones.
Tipos de menú
| Tipo | Descripción |
|---|---|
| Menú principal | Aparece en la parte inferior de la pantalla al pulsar el botón de menú |
| Submenú | Menú secundario que se despliega desde una opción del menú principal |
| Menú contextual | Aparece al mantener pulsado un elemento de la pantalla |
Los menús pueden crearse mediante XML en la carpeta res/menu/ o directamente por código Java.
Menú principal
Definición en XML (res/menu/activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/configuracion"
android:title="Configuración"
android:icon="@android:drawable/ic_menu_preferences" />
<item
android:id="@+id/acerca_de"
android:title="Acerca de"
android:icon="@android:drawable/ic_menu_info_details" />
</menu>
Inflar el menú XML en Java
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.activity_main, menu);
return true;
}
Crear el menú por código
private static final int MNU_OPC1 = 1;
private static final int MNU_OPC2 = 2;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(Menu.NONE, MNU_OPC1, Menu.NONE, "Opción 1")
.setIcon(android.R.drawable.ic_menu_preferences);
menu.add(Menu.NONE, MNU_OPC2, Menu.NONE, "Opción 2")
.setIcon(android.R.drawable.ic_menu_info_details);
return true;
}
Gestionar la selección
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case MNU_OPC1:
Toast.makeText(getApplicationContext(), "Opcion 1",
Toast.LENGTH_SHORT).show();
return true;
case MNU_OPC2:
Toast.makeText(getApplicationContext(), "Opcion 2",
Toast.LENGTH_SHORT).show();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
Menú contextual
El menú contextual aparece al mantener pulsado un elemento. En este ejemplo, al mantener pulsado un TextView con una pregunta sobre Aragón, aparece un menú con las tres provincias.
XML del menú contextual (res/menu/menu_aragon.xml)
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/huesca" android:title="Huesca" />
<item android:id="@+id/zaragoza" android:title="Zaragoza" />
<item android:id="@+id/teruel" android:title="Teruel" />
</menu>
Implementación en Java
TextView lblPregunta;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_menu_contextual);
lblPregunta = (TextView) findViewById(R.id.lblPregunta);
registerForContextMenu(lblPregunta);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_aragon, menu);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.huesca:
lblPregunta.setText("¡¡¡Fato!!!");
return true;
case R.id.zaragoza:
lblPregunta.setText("¡¡¡Cheposo!!!");
return true;
case R.id.teruel:
lblPregunta.setText("Mmmm... ¡¡¡ababoles!!!");
return true;
default:
return super.onContextItemSelected(item);
}
}
La clave es registrar la vista con registerForContextMenu() en onCreate() para que Android sepa que debe mostrar el menú contextual al hacer pulsación larga sobre ella.