2012-10-06 51 views
6

Quiero utilizar diferentes iconos ActionBar según el estilo que uso (oscuro o claro). yo no podía dar con la forma, aquí está lo que he intentado:Cambiar los iconos del menú ActionBar según el estilo

<style name="AppThemeDark" parent="Theme.Sherlock.ForceOverflow"> 
     <item name="android:actionButtonStyle">@style/customActionButtonStyleDark</item> 
     <item name="actionButtonStyle">@style/customActionButtonStyleDark</item> 
    </style> 

    <style name="AppThemeLight" parent="Theme.Sherlock.Light.ForceOverflow"> 
     <item name="android:actionButtonStyle">@style/customActionButtonStyleLight</item> 
     <item name="actionButtonStyle">@style/customActionButtonStyleLight</item> 
    </style> 

    <style name="customActionButtonStyleDark" > 
     <item name="@drawable/action_search">@drawable/action_search</item> 
    </style> 

    <style name="customActionButtonStyleLight" > 
     <item name="@drawable/action_search">@drawable/action_search_light</item> 
    </style> 

También probé para insertar <item name="@drawable/action_search">@drawable/action_search</item> directamente en el estilo del tema, pero nada funcionó.
¿Alguna idea de cómo?

Respuesta

1

lo resolvió, pero renunció a intentarlo con XML, lo hice ahora mediante programación:

@Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     SharedPreferences prefs = getSharedPreferences("app", 0); 
     boolean isDark = "Dark".equals(prefs.getString("theme", "Dark")); 

     com.actionbarsherlock.view.MenuInflater inflater = getSupportMenuInflater(); 
     inflater.inflate(R.menu.main, menu); 

     // set Icons 
     menu.findItem(R.id.menuitem_search).setIcon(isDark ? R.drawable.action_search : R.drawable.action_search_light); 
     menu.findItem(R.id.menuitem_add).setIcon(isDark ? R.drawable.content_new : R.drawable.content_new_light); 
     menu.findItem(R.id.menuitem_share).setIcon(isDark ? R.drawable.social_share : R.drawable.social_share_light); 
     return true; 
    } 
2

creo que usted no recibió tematización :) Cuando usted está tratando de hacer:

<style name="customActionButtonStyleDark" > 
    <item name="@drawable/action_search">@drawable/action_search</item> 
</style> 

Usted está tratando de sobrecargar algún atributo en el tema con el nombre de "@ estirable/action_search"

tengo malas noticias para ti, creo que no hay tal. Entonces puede ir al tema Theme.Sherlock.ForceOverflow y sus padres y ver qué puede sobrecargar.

Si nada le sirve, y desea tener un atributo personalizado en su tema para diferentes iconos, es un tema diferente. Debe crear un atributo en attrs.xml, señalar el origen de su icono a este nuevo atributo y definir el valor del atributo en el tema. Para cada botón diferente.

18

A pesar de que has encontrado una solución, tal vez esto ayude a alguien más. Encontré una manera simple de hacer esto en xml (a qué se refiere la respuesta de logcat). El truco que utilicé fue crear atributos personalizados para mis iconos de menú/barra de acciones. Debe tener un atributo por icono de elemento de menú.

Necesita crear attrs.xml en su carpeta values y agregue sus atributos personalizados. Piense en cada atributo como una constante que configuren sus temas/estilos, y luego sus estilos/vistas pueden usar esos contenidos para establecer propiedades.

<declare-styleable name="customAttrs"> 
    <attr name="customSearchIcon" format="reference" /> 
</declare-styleable> 

En su styles.xml en su carpeta values, tienen sus temas/estilos que establecer los atributos de su icono personalizado a drawable referencias.

<style name="AppThemeDark" parent="Theme.Sherlock.ForceOverflow"> 
    <item name="customSearchIcon">@drawable/action_search</item> 
</style> 

<style name="AppThemeLight" parent="Theme.Sherlock.Light.ForceOverflow"> 
    <item name="customSearchIcon">@drawable/action_search_light</item> 
</style> 

Por último, en su [menu_name].xmlmenu en su carpeta, haga que su elemento de menú en su icono correspondiente a su atributo icono personalizado.

<item 
    android:id="@+id/menuitem_search" 
    android:icon="?attr/customSearchIcon"/> 

Ahora, dependiendo de qué tema esté configurado, el ícono del elemento de menú cambiará. Además, esto le permite tener versiones específicas de sus drawables (claros y oscuros) usando sus identificadores de recursos con sus carpetas drawable, para que pueda tener diferentes iconos de estilo de menú para los iconos de estilo pre 3.0 y de la barra de acciones para 3.0+.

Además, recuerde que al establecer un tema en tiempo de ejecución (frente a AndroidManifest.xml), debe configurarlo antes de llamar al setContentView() en su Activity. Se recomienda reiniciar su actividad después de cambiar el tema de un Activity que ya se ha creado.

+0

Se está trabajando muy bien, gracias de! Pero, ¿cómo usarlo desde Java? Cuando llamo a menuLetters.setIcon (R.attr.ic_action_messages); Me da error que el recurso no se encuentra. – BArtWell

+2

Buena pregunta, creo que la respuesta es [aquí] (http://stackoverflow.com/questions/8793183/access-resource-defined-in-theme-and-attrs-xml-android). El truco parece ser que tienes que decirle a Android qué tema está configurado actualmente, para que sepa qué recurso de estilo tomar. –

+0

Sí, tienes razón, está funcionando bien también. ¡Gracias! – BArtWell

0

Ver res/xml/ic_search.xml en el blog AppCompat — Age of the vectors (Chris Barnes)

Aviso la referencia a ?attr/colorControlNormal

<vector xmlns:android="..." 
    android:width="24dp" 
    android:height="24dp" 
    android:viewportWidth="24.0" 
    android:viewportHeight="24.0" 
    android:tint="?attr/colorControlNormal"> 
    <path 
     android:pathData="..." 
     android:fillColor="@android:color/white"/> 
</vector> 
Cuestiones relacionadas