2012-05-16 22 views
24

ContextoActionBarSherlock - Mostrar desbordó elementos de acción como icono + texto

Estoy creando una barra de acciones con algunos elementos de acción, utilizando ActionBarSherlock. Algunos de ellos están desbordados, por lo que se muestran en el submenú de desbordamiento.

Mi problema

Esos artículos desbordadas se muestran en el submenú simplemente como meros textos.

He tratado MenuItem.SHOW_AS_ACTION_IF_ROOM y MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT para setShowAsAction() pero ambos tienen el mismo comportamiento:

Overflowed items without icon

Lo que quiero

¿Es posible mostrar estos elementos en el submenú de desbordamiento como <their_icon> + <their_text>? Algo como esto:

Overflowed items with icon

+0

¿Alguna vez tuvo éxito con esto? – Quentamia

+0

Todavía no ... Sin embargo, parece que la ActionBar nativa (API nivel 11+) puede hacerlo (ver: http://developer.android.com/design/patterns/actionbar.html, específicamente la imagen de aplicación de galería en Android 4.0), o es una implementación especial "hecha a mano"? –

+0

@Cristian, no hay tal imagen de ejemplo en el enlace mencionado.El único menú "desplegable" que tiene iconos en esa página es el menú "Compartir", pero ese no es el "Desbordamiento de la acción" – Gavriel

Respuesta

15

No entiendo por qué los submenús pueden tener iconos y menús solo texto. Quizás agregar elementos de menú como submenús al menú root podría ayudarlo. :)

Solo una mención, agregar iconos como este te obligará a usar la barra de acciones (Sherlock) y no la forma estándar de mostrar menús en la parte inferior cuando presionas la tecla de menú en versiones anteriores de Android.

<menu xmlns:android="http://schemas.android.com/apk/res/android" > 
<item 
    android:id="@+id/root_menu" 
    android:icon="@drawable/ic_menu_moreoverflow_normal_holo_light" 
    android:showAsAction="always" 
    android:title="More"> 
    <menu> 
     <item 
      android:id="@+id/menu_settings" 
      android:icon="@drawable/ic_menu_settings_holo_light" 
      android:showAsAction="never" 
      android:title="Settings" /> 
     <item 
      android:id="@+id/menu_about" 
      android:icon="@drawable/ic_menu_info_details" 
      android:showAsAction="never" 
      android:title="About"/> 
    </menu> 
</item> 
</menu> 
+0

Gracias, @Arise. Eso es lo que hice para lograr esta apariencia. Sin embargo, no lo publiqué como una solución porque lo considero una solución para mi caso particular, ya que implica forzar la distribución de elementos de acción en la barra de acciones (es decir, forzarlos a ser 1, 2 o 3), en lugar de dejar que el sistema decida cuántos de ellos se mostrarán. De todos modos, tu respuesta es útil si quieres definir un _tree_ específico en el menú de la barra de acciones –

+0

Excelente respuesta si sabes lo que contiene tu lista desplegable, básicamente cuando no necesita ser dinámica. ¡Gracias! – ryvianstyron

+0

@Arise cómo agregar esto enCreateOptionsMenu y manejar sus eventos de clics .. – test

6

1, cambie el valor de verdad de "mOptionalIconsVisible" en com.actionbarsherlock.internal.view.menu.MenuBuilder.java. Entonces verás los íconos siempre. Solo funciona para ActionBarSherlockCompact.java.

2, Cambie el código fuente para agregar una API para MenuBuilder.java y MenuWrapper.java para establecer el icono.

+0

Gracias por su respuesta rohn.chan. Sin embargo, me gustaría aplicar una solución que no implique modificar el código fuente de ActionBarSherlock, ya que debería aplicarlo en cada actualización de esta biblioteca. –

+0

Un poco tarde, pero no tiene que aplicar la modificación cada vez. Simplemente obtenga una copia del repositorio sherlock de Actionbar, realice la modificación y extraiga las actualizaciones. Los nuevos conjuntos de cambios se aplican cuando tira, pero sus cambios no se borran en el proceso. – Teovald

5

Tengo un trabajo para tal escenario. Si está seguro de lo que desea colocar en el menú de desbordamiento, puede colocarlos en un submenú, y puede colocar el icono y el título para ese elemento del menú secundario junto con los menús secundarios omitiendo el método onCreateOptionsMenu.

Esto es lo que he hecho para conseguir esta funcionalidad:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 

    menu.add(0, 1, 1, "MENU ONE TITLE") 
    .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT); 

    SubMenu subMenu = menu.addSubMenu(0, 0, 2, "MENU TWO TITLE"); 

    subMenu.add(0, 2, 2, "SUB MENU ONE TITLE") 
    .setIcon(R.drawable.sub_menu_one_icon); 

    subMenu.add(0, 3, 3, "SUB MENU TWO TITLE") 
    .setIcon(R.drawable.sub_menu_two_icon); 

    MenuItem subMenuItem = subMenu.getItem(); 
    subMenuItem.setIcon(R.drawable.menu_two_icon); 
    subMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT); 

    return super.onCreateOptionsMenu(menu); 
} 
+0

Esta es la programática equivalente a la respuesta de @Arise. El problema es que NO sé exactamente qué tiene que haber en el menú de desbordamiento, debería ser automático (es decir, decidido por el sistema). Por ejemplo, en un dispositivo con espacio suficiente, no se debe mostrar el menú de desbordamiento en el ejemplo que publiqué, ya que hay espacio suficiente para mostrar todos los elementos. –

0

En realidad, no es una manera de añadir un icono para el texto, incluso para los menús emergentes que se crean para el menú de desbordamiento. Por ejemplo:

final MenuItem menuItem=... 
final ImageSpan imageSpan=new ImageSpan(this,R.drawable.ic_stat_app_icon); 
final CharSequence title=" "+menuItem.getTitle(); 
final SpannableString spannableString=new SpannableString(title); 
spannableString.setSpan(imageSpan,0,1,0); 
menuItem.setTitle(spannableString); 

Esto colocará un icono al principio del elemento del menú, justo antes de su texto original.

Cuestiones relacionadas