Los elementos del menú no se muestran en la barra de acciones

He hecho un proyecto completamente nuevo. He agregado elementos al archivo de diseño del menu . Esos elementos no se muestran en el lado derecho de la barra de acciones. Recuerdo que aparece un ícono con tres puntos que abre el menú.

enter image description here

Aquí está mi Activity

 public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ActionBar actionBar = getActionBar(); actionBar.setBackgroundDrawable(new ColorDrawable(Color.BLUE)); actionBar.show(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } } 

Y aquí está mi main.xml

      

Dado que estableces el atributo showAsAction en never , estos elementos de menú nunca se mostrarán como vistas de acción. Prueba esto:

      

Contexto

Parece haber un malentendido sobre esta propiedad showAsAction en la configuración del menú. La información que encuentro en las muchas respuestas de stackoverflow siempre parece incompleta. Entonces aquí hay un bash de cambiar eso.

Tres puntos | desbordamiento | menú de opciones

No hay forma de controlar si su barra de acciones mostrará el menú de desbordamiento de tres puntos o no en el código.

Bueno, puedes forzarlo a no mostrarse sin tener opciones de menú seguro. Y para ser justos, puede hackear esto, más información en Cómo forzar el uso del menú de desbordamiento en los dispositivos con el botón de menú

Los puntos que muestran o no dependen del dispositivo con el que está probando . Los dispositivos con un botón de menú NO MOSTRARán el icono de tres puntos en la barra de acciones, ya que los usuarios pueden usar el botón de menú en el dispositivo.

botón de menú de opciones en el dispositivo

Los dispositivos que no tienen este botón de menú de opciones (como los dispositivos nexus que comienzan en Galaxy) no tienen alternativa para activar ese menú de opciones. Al ejecutar la misma aplicación en estos dispositivos, se mostrará la opción de menú de desbordamiento de tres puntos en la barra de acciones.

barra de acciones que muestra el menú de opciones

Qué puedes controlar

Existe la opción showAsAction en el archivo xml del menú que puede usar para controlar cómo se mostrará esa opción de menú individual en la barra de acciones.

De acuerdo con el documento oficial de recursos del menú, las opciones son:

 android:showAsAction=["ifRoom" | "never" | "withText" | "always" | "collapseActionView"] 

El indicador ifRoom solo muestra la opción si hay suficiente espacio. Esta debería ser su primera opción en la mayoría de los casos. Sin embargo, esto condensará el título en la barra de acciones (ver la captura de pantalla vertical orientada).

El indicador never tendrá esta opción siempre en el menú de desbordamiento y nunca directamente en la barra de acciones.

Se desaconseja el uso de la marca always , ya que forzará la opción de aparecer siempre en la barra de aciton. Incluso si se ejecuta en un tamaño de pantalla muy pequeño. Esto podría hacer que el título sea completamente invisible.

Como es posible, ahora un menú de opciones puede tener tanto un android:title como una propiedad de android:icon . Puede usar el indicador withText junto con always o ifRoom (use un pipe | in between) para forzar que el texto del elemento se muestre al lado del icono cuando se representa en la barra de acciones.

El collapseActionView solo es compatible con el API level 14 de la API level 14 así que déjame ignorarlo.

Una captura de pantalla que muestra el siguiente fragmento de código en acción en un dispositivo sostenido en modo vertical:

Título colapsado y en su mayoría íconos en orientación vertical

Y otra captura de pantalla donde hay más espacio en la barra de acciones gracias al modo de paisaje:

modo de paisaje, barra de acciones renderizada

Documentación de Android

El mejor documento de desarrollo sobre esta barra de acciones sería la guía de la barra de acciones . Si buscas más pautas de diseño, sigue este enlace . El enlace del recurso del menú fue enumerado antes. Para menús en general, verifique esto .

Fragmento de código

El código solo sirve de referencia ya que esa parte parece estar bien en la mayoría de las respuestas. Se puede encontrar un ejemplo más completo en https://github.com/AndroidExamples/fragment-navigation

El contenido del archivo /res/menu/main.xml :

             

Algunas respuestas vinculadas

  • Botones de acción no aparece en la barra de acción?
  • Barra de acciones no se muestra con AppCompat
  • Android: quiere mostrar el menú de 3 puntos en ICS

Creo que desea mostrar siempre el icono del menú de desbordamiento en la esquina superior derecha y desea que su menú se abra desde allí. Intente algo así como seguir para forzarlo allí:

Dentro de tu onCreate() haz:

  try { ViewConfiguration config = ViewConfiguration.get(this); Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey"); if(menuKeyField != null) { menuKeyField.setAccessible(true); menuKeyField.setBoolean(config, false); } } catch (Exception ex) { // Ignore } 

Obligará a la aplicación a mostrar el menú de desbordamiento. El botón de menú seguirá funcionando, pero abrirá el menú en la esquina superior derecha. Tomado de esta respuesta en Cómo forzar el uso del menú de desbordamiento en los dispositivos con el botón de menú . Esto podría ser una especie de ‘hack’, pero funciona.

Editar:

Basado en comentarios útiles de @gunar, solicito no usar este método. Las siguientes son las razones :

  • El campo privado sHasPermanentMenuKey se puede refactorizar en versiones futuras. Tu aplicación dejará de funcionar entonces.

  • Además, si fuerza el movimiento de los elementos de acción a la barra de acciones porque está acostumbrado a ellos, terminará por confundir a los usuarios que están acostumbrados a cómo se ejecutan las aplicaciones en su dispositivo. Aquellos con la tecla de menu hardware se usarán para tener las opciones mostradas desde la tecla de hardware del menú. Si intencionalmente les muestra los tres puntos del menú de desbordamiento, podría confundirlos.

Así que permite que todas las aplicaciones sean uniformes en ese sentido. Aquellos dispositivos sin clave de hardware para menu elementos del menu los mostrarán automáticamente.

O podrías crear una estructura como:

           

Donde icon_menu puede crear un nuevo conjunto de icons con el clipart de tres puntos.

Yo tuve el mismo problema. E hice todas las cosas que dije antes. Mi problema es que olvidé anular onCreateoptionMenu (Menú menú).

 @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu,menu); return super.onCreateOptionsMenu(menu); } 

Añadir

 Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); 

en el método onCreate

Después de buscar y leer muchas respuestas, descubrí que hay otra pequeña cosa a la que debes prestarle atención.

Al menos era mi problema y no encontré una respuesta de ninguna de las anteriores. En tu archivo .XML Your android:showAsAction= no debe ser un paquete de android , debe ser del paquete de la app como en el ejemplo a continuación:

 app:showAsAction= 

No olvides importar el paquete de la app .

todas las respuestas anteriores explicaron bien este problema

pero ¿podemos anular esta limitación y tener el elemento de menú de desbordamiento?

si podemos hackear

  private void makeActionOverflowMenuShown() { //devices with hardware menu button (eg Samsung Note) don't show action overflow menu try { ViewConfiguration config = ViewConfiguration.get(this); Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey"); if (menuKeyField != null) { menuKeyField.setAccessible(true); menuKeyField.setBoolean(config, false); } } catch (Exception e) { Log.d(TAG, e.getLocalizedMessage()); } } 

y dentro deCreate llámalo

referencias: https://stackoverflow.com/a/13098824/4251431

Debe llamar a esta función en la función Crear de la actividad.

 RequestWindowFeature (Window.FEATURE_ACTION_BAR); 

agregar un espacio de nombre personalizado como este para mostrarAsAction y actionViewClass