Introducción a los menús de Android

Hay tres tipos de menús en Android: Popup, Contextual y Options.

Cada uno tiene un caso de uso específico y un código que lo acompaña. Para aprender a usarlos, sigue leyendo.

Cada menú debe tener un archivo XML relacionado que defina su diseño. Estas son las etiquetas asociadas con la opción de menú:

- Este es el elemento contenedor para su menú (similar a LinearLayout)

- Esto denota un elemento y está anidado dentro de la etiqueta del menú. Tenga en cuenta que un elemento de elemento puede contener un elemento para representar un submenú

- Esto se usa para indicar una determinada propiedad o característica en un par de elementos del menú (estado / visibilidad de IE)

Como se muestra en el fragmento de código anterior, cada elemento del menú tiene varios atributos asociados. Detallaré los principales aquí, pero si quieres ver qué más puedes agregar, ve aquí.

  • id : este es un identificador único para el elemento en el menú. Puede usar esto para ver exactamente en qué elemento hizo clic el usuario
  • icono : si desea mostrar un icono asociado con ese elemento de menú
  • título : texto que se mostrará en el menú para ese elemento
  • showAsAction : este atributo solo debe usarse cuando se usa un menú en una actividad que usa una barra de aplicación (o como también se le conoce, la barra de acción). Controla cuándo y cómo debe aparecer este elemento como acción en la barra de la aplicación. Hay cinco valores: siempre, nunca, ifRoom, withText y collapseActionView
android:showAsAction="always|never|ifRoom|withText|collapseActionView" 

Detallaré el significado de cada uno de estos valores en la siguiente sección.

Además, debe agregar el método de menú onCreate relevante a su actividad.

//Options Menu @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.options_menu, menu); return super.onCreateOptionsMenu(menu); } //Context Menu @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.context, menu); }

Menú de opciones

Este menú generalmente se encuentra en la parte superior de tu aplicación y en él debes colocar acciones que afecten a la aplicación en su conjunto. Estos podrían ser la configuración de la aplicación o un cuadro de búsqueda.

Usando el diseño del menú de arriba, obtenemos el siguiente menú de opciones:

Como prometimos, repasemos los valores que se pueden dar para el atributo showAsAction:

  • siempre: siempre se mostrará en la barra de acciones.
  • nunca: nunca se mostrará y, por lo tanto, estará disponible a través del menú adicional
  • ifRoom: solo si hay suficiente espacio en la barra de acciones, se mostrará. Tenga en cuenta que según la documentación, hay un límite en la cantidad de iconos que puede tener en la barra de acciones.
  • withText: incluirá el título del elemento en la barra de acción
  • collapseActionView: si este elemento tiene una vista de acción asociada, se volverá plegable (desde API 14 y superior)

Si seguimos adelante y cambiamos el último elemento de nuestro menú a showAsAction = ”nunca” , obtenemos lo siguiente:

Imagen para publicación

Menú contextual

Este menú aparece cuando un usuario realiza un clic prolongado en uno de los elementos de la interfaz de usuario. Las opciones que se encuentran en este menú afectan el elemento de la interfaz de usuario en el que el usuario hizo clic. Es común utilizar este tipo de menú en vistas de lista o cuadrícula, donde la interacción del usuario con cada elemento puede conducir a una acción específica.

Imagine un escenario en el que tiene una aplicación con una imagen y desea presentar al usuario varias opciones cuando hace clic en la imagen.

Un menú contextual puede aparecer de dos formas:

  1. Un menú flotante
  2. Una barra de acción en la parte superior de su aplicación.

Solo demostraremos cómo usar la primera opción, pero puede leer más sobre la segunda opción aquí.

Usando el siguiente XML:

Y agregando el siguiente código a nuestra actividad principal:

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TYPE_OF_LAYOUT layout = (TYPE_OF_LAYOUT)findViewById(R.id.main_layout); registerForContextMenu(layout); }

Obtendremos lo siguiente:

Menú emergente

Un menú emergente es un tipo de menú que muestra elementos en una lista vertical. Esta lista se adjunta a la vista en la que el usuario ha hecho clic para invocar este menú. Es importante tener en cuenta que al elegir un menú emergente, no desea que la elección del usuario afecte el contenido anterior que presionó el usuario.

Usaremos el mismo diseño XML de menú que antes, pero necesitaremos agregar el siguiente código a nuestra actividad:

void showPopupMenu(View view) { PopupMenu popup = new PopupMenu(this, view); MenuInflater inflater = popup.getMenuInflater(); inflater.inflate(R.menu.actions, popup.getMenu()); popup.show(); }

Obtendremos el mismo resultado que la captura de pantalla anterior, pero sin necesidad de que el usuario realice un clic largo.

Iconos en menús emergentes

Ahora sé para qué probablemente estás aquí: quieres saber cómo puedes agregar íconos a los menús .

Si bien mostraré un ejemplo de cómo hacer esto, es aconsejable comprender que esta es una función que no está habilitada para los menús emergentes y puede causar un comportamiento inesperado. Puede lograr esto usando la reflexión para activar una bandera llamada setForceShowIcon .

//popup is an instance of PopupMenu try { Field[] fields = popup.getClass().getDeclaredFields(); for (Field field : fields) { if ("mPopup".equals(field.getName())) { field.setAccessible(true); Object menuPopupHelper = field.get(popup); Class classPopupHelper = Class.forName(menuPopupHelper .getClass().getName()); Method setForceIcons = classPopupHelper.getMethod( "setForceShowIcon", boolean.class); setForceIcons.invoke(menuPopupHelper, true); break; } } } catch (Throwable e) { e.printStackTrace(); }

Acabo de arañar la superficie con los menús de Android, pero espero que sea suficiente para inspirarte a profundizar más.