Compruebe si MenuItem está en desbordamiento de ActionBar

Pregunta: ¿Hay una manera de comprobar en código si un MenuItem (o que MenuItems) están en el menú de desbordamiento de la ActionBar? Estoy usando ActionBarSherlock

La razón que necesito esto es porque tengo un montón de iconos que se mostrarán en la barra de acción si hay espacio. Tengo un holo tema oscuro por lo que los iconos se hacen para adaptarse a eso.

Mi problema viene cuando los elementos del menú se ponen en el menú de desbordamiento. En los dispositivos Pre-Honeycomb esto significa que se mostrarán cuando el usuario pulse el botón de menú. Este menú es el fondo opuesto exactamente como mi ActionBar y quiero tener un diverso sistema de iconos para caber eso.

Podría haber encontrado una solución a este problema: En la Guía de diseño ( aquí ), hay una tabla que muestra cuántos elementos de la barra de acción se muestran en función del ancho de inmersión.

Sobre la base de esa tabla he escrito el siguiente código:

@Override public boolean onPrepareOptionsMenu(Menu menu) { MenuItem search = menu.findItem(R.id.menu_search); // Get width in dp DisplayMetrics metrics = new DisplayMetrics(); Display display = getWindowManager().getDefaultDisplay(); display.getMetrics(metrics); float logicalDensity = metrics.density; int dp = (int) (display.getWidth() / logicalDensity + 0.5); if (dp < 360) { // only two icons search.setIcon(R.drawable.ic_menu_search); // Show menu icon for pre-3.0 menu } else { search.setIcon(R.drawable.ic_action_search); // Show action bar icon for action bar } return true; } 

He publicado una respuesta a una pregunta similar que resolverá su problema, consulte:

https://stackoverflow.com/a/18884872/1299562

Básicamente puede utilizar onPrepareOptionsMenu para eliminar los íconos de elementos que no son acción.

Puedes usar la reflexión. Ponga el código siguiente en una clase y luego invoque Foo.isInOverflow(yourMenuItem);

 protected static final String SUPPORTCLASS = "android.support.v7.internal.view.menu.MenuItemImpl"; protected static final String NATIVECLASS = "com.android.internal.view.menu.MenuItemImpl"; protected static Method sSupportIsActionButton; protected static Method sNativeIsActionButton; static { try { Class<?> MenuItemImpl = Class.forName(NATIVECLASS); sNativeIsActionButton = MenuItemImpl.getDeclaredMethod("isActionButton"); sNativeIsActionButton.setAccessible(true); } catch (Exception ignored) { } try { Class<?> MenuItemImpl = Class.forName(SUPPORTCLASS); sSupportIsActionButton = MenuItemImpl.getDeclaredMethod("isActionButton"); sSupportIsActionButton.setAccessible(true); } catch (Exception ignored) { } } // -------------------------------------------------------------------------------------------- /** * Check if an item is showing (not in the overflow menu). * * @param item * the MenuItem. * @return {@code true} if the MenuItem is visible on the ActionBar. */ public static boolean isActionButton(MenuItem item) { switch (item.getClass().getName()) { case SUPPORTCLASS: try { return (boolean) sSupportIsActionButton.invoke(item, (Object[]) null); } catch (Exception e) { // fall through } case NATIVECLASS: try { return (boolean) sNativeIsActionButton.invoke(item, (Object[]) null); } catch (Exception e) { // fall through } default: return true; } } /** * Check if an item is in the overflow menu. * * @param item * the MenuItem * @return {@code true} if the MenuItem is in the overflow menu. * @see #isActionButton(MenuItem) */ public static boolean isInOverflow(MenuItem item) { return !isActionButton(item); } 

Nota: debe agregar la siguiente línea a su archivo de configuración proguard para que la reflexión funcione en compilaciones de producción:

 -keep public class android.support.v7.internal.view.menu.** { *; } 
  • Android ActionBar MenuItem LowerCase
  • ¿Agregar MenuItem a NavigationView con el icono y el título?
  • ¿Cómo puedo modificar un MenuItem en el menú de opciones de Android?
  • Dos líneas de texto para MenuItem
  • Disposición personalizada de MenuItem de Android
  • Botón de selección de Android MenuItem
  • Icono de menú que no se muestra en la barra de acción
  • ActionBarSherlock menú de texto del panel de menú duro
  • Android: muestra el menú de varias actividades
  • Android - Cómo cambiar dinámicamente el texto del elemento de menú fuera de onOptionsItemsSelected o onCreateOptionsMenu
  • Cómo cambiar la posición de los elementos del menú en la barra de acciones
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.