Elemento de menú Android 4.3 showAsAction = "siempre" ignorado

Estoy usando la nueva librería v7 appcompat disponible a partir de Android 4.3 (API nivel 18).

Independientemente de lo que se especifica en showAsAction para un elemento de menú, no se muestra – siempre crea el icono de menú de desbordamiento y coloca incluso un elemento de menú único en el menú.

Tratando de agregar menú a una actividad como esta:

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

Y aquí está mi menú xml:

 <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/menu_add_size" android:title="@string/menu_add_item" android:orderInCategory="10" android:showAsAction="always" android:icon="@android:drawable/ic_menu_add" /> </menu> 

¿Es un error de la nueva biblioteca de soporte v7, o algo mal con el código? He estado usando el código similar con ActionBarSherlock muchas veces antes.

Probablemente falta el espacio de nombres necesario:

 <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:[yourapp]="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/menu_add_size" android:title="@string/menu_add_item" android:orderInCategory="10" [yourapp]:showAsAction="always" android:icon="@android:drawable/ic_menu_add" /> </menu> 

Reemplazar [yourapp] con el nombre de su aplicación o cualquier espacio de nombres que su corazón desea en todas partes.

Otras cosas que vale la pena revisar:

  • Vea si su clase de actividad extiende ActionBarActivity

Compruebe si el problema persiste.


Documentación de referencia de Android: Añadir botones de acción . Aquí está el texto relevante:

Si su aplicación está utilizando la Biblioteca de soporte para la compatibilidad en versiones tan bajas como Android 2.1, el atributo showAsAction no está disponible en el espacio de nombres android. En su lugar, este atributo es proporcionado por la biblioteca de soporte y debe definir su propio espacio de nombres XML y utilizar ese espacio de nombres como prefijo de atributo. (Un espacio de nombres XML personalizado debe basarse en el nombre de la aplicación, pero puede ser cualquier nombre que desee y sólo está accesible dentro del ámbito del archivo en el que lo declara).

Me averigué. Con la biblioteca de soporte v7 el showAsAction debe ir bajo un espacio de nombres personalizado como este:

 <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:balloonberry="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/menu_add_size" android:title="@string/menu_add_item" android:orderInCategory="10" balloonberry:showAsAction="always" android:icon="@android:drawable/ic_menu_add" /> </menu> 

También asegúrese de que utiliza inflador correcto en el método ActionBarActivity.onCreateOptionsMenu ().

Solución correcta:

 MenuInflater menuInflater = getMenuInflater(); menuInflater.inflate(R.menu.menu_example, menu); 

Solución incorrecta:

 MenuInflater menuInflater = new MenuInflater(this); menuInflater.inflate(R.menu.menu_example, menu); 

Para Fragmentos

Los menús con espacio de nombres personalizado evitarán que showAsAction aparezca.

El uso del prefijo "android:" para showAsAction funcionará, aunque Android Studio comentará que debe usar un espacio de nombre personalizado.

 <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/action_add_checkin" android:title="Add Checkin" android:orderInCategory="10" android:showAsAction="always" android:icon="@android:drawable/ic_menu_add"/> </menu> 

Esto es usar Android SDK 22 y Support v4 fragmentos, en caso de que hace cualquier diferencia.

Tengo el mismo problema, pero en Android 5. Tengo 3 elementos, pero OS ignoró mi atributo "siempre" y mostró sólo 2 elementos. Aquí mi solución:

  @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { Log.d(TAG, "onCreateOptionsMenu()"); inflater.inflate(R.menu.your_menu, menu); for (int j = 0; j < menu.size(); j++) { MenuItem item = menu.getItem(j); Log.d(TAG, "set flag for " + item.getTitle()); item.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_ALWAYS); } } 

En mi caso, tuve que eliminar de la compilación build.gradle de mi aplicación 'com.android.support:appcompat-v7:21.0.3'.

Aviso : Mi min sdk = 14, y el proyecto creado por el estudio de Android insertó mi dependencia unnesessary.

Después de esto sustituya usted puede escribir android: showAsAction = "always"

También asegúrese de que tiene la ruta correcta para el espacio de nombres. No le dará un mensaje de error si está mal.

tuve

 <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:myapp="http://schemas.android.com/res-auto"> 

en lugar de

 <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:myapp="http://schemas.android.com/apk/res-auto"> 

Todo lo que sabía era que no funcionaba. No estoy seguro de cómo me las arreglé para olvidar la / apk parte de la ruta, pero sucedió. No hay mensaje de error, sólo un error elusivo para rastrear.

Tenía el mismo problema.

tuve

 <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/searchRunner" android:icon="@drawable/ic_home_black" android:title="Search" android="ifRoom"/></menu> 

en lugar de

 <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/item1" android:title="Options"/> <item android:id="@+id/searchRunner" android:icon="@drawable/ic_home_black" android:title="Search" app:showAsAction="ifRoom"/></menu> 
 <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" > <item android:id="@id/back" android:icon="@drawable/back" app:showAsAction="always" android:title="@string/back"/> <item android:id="@id/save" android:icon="@drawable/le_top_btn_icon_add" app:showAsAction="ifRoom" android:title="@string/save"/> </menu> 

No funcionan, con supportLibraryVersion = '25 .1.0 'compileSdkVersion = 25

Consulte la sección "Advertencia"

Debe usar app: showAsAction con la librería appcompat con xmlns: app = "http://schemas.android.com/apk/res-auto&quot; menos … (Ctrl + F1)

Cuando se utiliza la biblioteca appcompat, los recursos del menú deben referirse a la función showAsAction en el espacio de nombres app: no, el espacio de nombres android :.

Del mismo modo, cuando no utilice la librería appcompat, debería usar el atributo android: showAsAction.

Creo que la advertencia puede ser ignorada.

Este podría no ser su caso, pero yo estaba usando

new MenuInflater(this).inflate(R.menu.my_menu, menu);

Cambiándolo a

getMenuInflater().inflate(R.menu.my_menu, menu);

Solucionado el problema!

  • Android: color de fondo cuando se pulsa el elemento de menú
  • Android: menuItem.expandActionView () en el nivel API <14
  • Cómo mostrar el elemento de menú con el icono y el texto en AppCompatActivity
  • Menú Android, lanzando IndexOutOfBoundsException mientras se ejecuta onPrepareOptionsMenu
  • Android ActionBar MenuItem LowerCase
  • Icono de menú que no se muestra en la barra de acción
  • Compruebe si MenuItem está en desbordamiento de ActionBar
  • Cómo cambiar de forma programática el color de fondo de los elementos de la barra de acción
  • Elemento de menú de opciones personalizadas de Android
  • Cómo crear una instancia de menú mediante programación? Es decir, inflar un menú fuera onCreateOptionsMenu
  • Cómo formatear una actividad de otra actividad mediante opciones de menú
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.