Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Cómo eliminar iconos de un menú de desbordamiento de ActionBarSherlock en Android 2.3?

Tengo una aplicación con ActionBarSherlock con el tema Theme.Sherlock.Light.DarkActionBar . La barra de acción es oscura y mis iconos de menú son ligeros. Cuando ejecuto mi aplicación en pequeños diseños, 2 o 3 elementos de menú con iconos se muestran en el menú de desbordamiento.

En Android 3+ los elementos del menú de desbordamiento no mostrarán sus iconos, pero en Android 2.3 y versiones anteriores veo los mosaicos de menú con iconos casi invisibles, porque el color de la baldosa es blanco y los iconos están cerca de ser blancos.

Introduzca aquí la descripción de la imagen

Como se puede ver, los iconos de luz son invisibles en un fondo blanco, pero deben tener color claro para ser visible en una barra de acción oscura:

Introduzca aquí la descripción de la imagen

¿Puedo eliminar iconos cuando se muestran elementos de menú en el menú de desbordamiento?

  • ¿Cómo abrir el menú de opciones mediante programación?
  • Android invalidateOptionsMenu () para API <11
  • Android: varios menús de opción en una actividad
  • Reducir los elementos del menú anchura, altura y tamaño de texto
  • Android: Detectar mediante programación si el dispositivo tiene botón de menú de hardware
  • ¿Cómo actualizar un elemento de menú que se muestra en la barra de acción?
  • Crear submenús de forma programática para el menú existente creado a partir de XML
  • Apertura del submenú en la barra de acción en el botón del menú Hardware
  • 5 Solutions collect form web for “Cómo eliminar iconos de un menú de desbordamiento de ActionBarSherlock en Android 2.3?”

    Yo también estaba enfrentando el mismo problema:

    Hay muchas maneras de lograr esto en lugar de eliminar la imagen:

    1) usted puede utilizar la carpeta respectiva drawable para poner la imagen ligera y oscura.

    2) También puede cambiar el color de fondo por código de su menú revisando la versión de su dispositivo.

    Si el dispositivo no soporta menú de desbordamiento, el, puede cambiar el color de fondo de su menú, así como también puede cambiar el color de texto del menú.

    También estaba enfrentando el mismo problema y resolvió usar uno siguiente:

     static final Class<?>[] constructorSignature = new Class[] {Context.class, AttributeSet.class}; class MenuColorFix implements LayoutInflater.Factory { public View onCreateView(String name, Context context, AttributeSet attrs) { if (name.equalsIgnoreCase("com.android.internal.view.menu.ListMenuItemView")) { try { Class<? extends ViewGroup> clazz = context.getClassLoader().loadClass(name).asSubclass(ViewGroup.class); Constructor<? extends ViewGroup> constructor = clazz.getConstructor(constructorSignature); final ViewGroup view = constructor.newInstance(new Object[]{context,attrs}); new Handler().post(new Runnable() { public void run() { try { view.setBackgroundColor(Color.BLACK); List<View> children = getAllChildren(view); for(int i = 0; i< children.size(); i++) { View child = children.get(i); if ( child instanceof TextView ) { ((TextView)child).setTextColor(Color.WHITE); } } } catch (Exception e) { Log.i(TAG, "Caught Exception!",e); } } }); return view; } catch (Exception e) { Log.i(TAG, "Caught Exception!",e); } } return null; } } public List<View> getAllChildren(ViewGroup vg) { ArrayList<View> result = new ArrayList<View>(); for ( int i = 0; i < vg.getChildCount(); i++ ) { View child = vg.getChildAt(i); if ( child instanceof ViewGroup) { result.addAll(getAllChildren((ViewGroup)child)); } else { result.add(child); } } return result; } @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { LayoutInflater lInflater = getLayoutInflater(); if ( lInflater.getFactory() == null ) { lInflater.setFactory(new MenuColorFix()); } super.onCreateContextMenu(menu, v, menuInfo); MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.myMenu, menu); } 

    3) cambiar el color de fondo del archivo styles.xml

     <style name="Theme.MyTheme" parent="Theme.Sherlock.ForceOverflow"> <item name="actionBarStyle">@style/Widget.MyTheme.ActionBar</item> <item name="android:actionBarStyle">@style/Widget.MyTheme.ActionBar</item> </style> <style name="Widget.MyTheme.ActionBar" parent="Widget.Sherlock.ActionBar"> <item name="android:background">#ff000000</item> <item name="background">#ff000000</item> </style> 

    Para mí, todos los 3 funcionó bien

    Esperanza, esto trabajará para usted también

    Puede usar calificadores de configuración. p.ej

    Hacer una carpeta drawable / res / drawable-v11 / poner todos los iconos de "luz" en ella.

    Y para los iconos más oscuros use la carpeta / res / drawable /.

    Asegúrese de utilizar los mismos nombres de archivo en ambas carpetas.

    Espero haber entendido su problema y esto podría ayudarle.

    Sin embargo, si desea cambiar el drawables JUSTO para el menú de desbordamiento, no creo que sea posible. También porque los iconos de menú no están destinados a ser utilizados de esa manera. ActionBarSherlock es probablemente también debido a problemas como este, no una biblioteca oficial.

    OS 2.x era un desastre, ya que el fondo del menú de opciones podría ser negro o blanco, dependiendo del dispositivo, sin saber cómo hacerlo.

    La solución fácil fue usar iconos de color gris (# 888888) para Android 2.x y debajo y poner sus iconos modernos (ICS / JB) en una carpeta v11 para dispositivos modernos:

     drawable // old school icons drawable-v11 // modern icons 

    Por supuesto que significa drawable-mdpi-v11, drawable-hdpi-v11, y así sucesivamente.

    Una alternativa simple a la adición de un conjunto completo de iconos oscuros duplicados para las versiones 2.x puede ser simplemente eliminar los iconos de todos los elementos que pueden ir al menú de desbordamiento. Por ejemplo:

    res/menu

     <item android:id="@+id/menu_send_email" android:showAsAction="ifRoom" android:title="@string/menu_send_email"/> 

    res/menu-v11 (o incluso res/menu-v9 , porque 2.3 por lo general tiene un menú oscuro)

     <item android:id="@+id/menu_send_email" android:icon="@drawable/ic_action_send_email" android:showAsAction="ifRoom" android:title="@string/menu_send_email"/> 

    Por supuesto, usted necesita hacer los títulos lo suficientemente cortos como para encajar en el ActionBar al menos en algunas pantallas más grandes, o resolver con el hecho de que siempre van en el desbordamiento.

    Otra opción es quitar los iconos de los elementos que no son acción en onPrepareOptionsMenu.

    La idea es usar MenuItemImpl.isActionButton de actionbarsherlock para averiguar si cada elemento es un elemento de acción, y si no quitar el icono. Esto se hace un poco complicado porque onPrepareOptionsMenu es llamado (al menos) dos veces por ABS – la primera vez que se está construyendo la barra de acción, en cuyo caso MenuItemImpl.isActionButton todavía no se ha establecido y siempre devolverá false. Si ese es el caso, usted desea dejar los iconos solos. Una vez que se ha construido la barra de acción, el método isActionButton devolverá true para los elementos de la barra de acción, false en caso contrario. Por lo tanto, desea eliminar los iconos de los que devuelven false. Esto es lo que me ocurrió:

     @Override public boolean onPrepareOptionsMenu(Menu menu) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { boolean buildingOptionsMenu = false; for (int i=0; i<menu.size(); ++i) { MenuItemImpl mi = (MenuItemImpl)menu.getItem(i); if (mi.isActionButton()) { buildingOptionsMenu = true; break; } } if (buildingOptionsMenu) { for (int i=0; i<menu.size(); ++i) { MenuItemImpl mi = (MenuItemImpl)menu.getItem(i); if (!mi.isActionButton()) { mi.setIcon(null); mi.setIcon(0); } } } } return super.onPrepareOptionsMenu(menu); } 

    Necesitará estas dos importaciones:

     import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.internal.view.menu.MenuItemImpl; 

    Esto funciona en ABS 4.3.0, pero como utiliza clases de biblioteca interna puede que no funcione con otras versiones de la biblioteca.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.