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.
- Cómo cambiar de forma programática el color de fondo de los elementos de la barra de acción
- Cambiar el icono del menú de opciones en la barra de acciones dependiendo de un fragmento abierto
- Establecer un elemento de menú tal como se ha comprobado desde el código
- Cómo cambiar dinámicamente el icono del elemento de menú ActionBar
- Android: menuItem.expandActionView () en el nivel API <14
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.
- Desactivar el color de resaltado de fondo del elemento de menú en android
- Agregue un MenuItem al menú en la posición o el grupo específico programmatically
- Cómo crear una instancia de menú mediante programación? Es decir, inflar un menú fuera onCreateOptionsMenu
- ¿Cómo puedo ocultar un elemento de menú en la barra de acción?
- Cómo poner superposición Ver sobre barra de acción Sherlock
- Vista personalizada para elemento de menú
- ¿Cómo ordenar elementos de menú en el menú de opciones de una aplicación de Android?
- App Crash al intentar cambiar textsize en textView haciendo clic en el botón
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.** { *; }
- ¿Cómo instalo Android NDK en el sistema operativo Windows? Sin ningún tipo de Linux Unix de la manera más fácil?
- Cambiar tipo de letra títulos – ActionBarSherlock