Cambiar iconos del menú ActionBar según el estilo

Quiero usar diferentes iconos de ActionBar dependiendo del estilo que uso (oscuro o ligero). No pude entender cómo, heres lo que intenté:

 <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 intenté insertar directamente en el estilo de tema <item name="@drawable/action_search">@drawable/action_search</item> , pero nada funcionó.
¿Alguna idea cómo?

A pesar de que encontró una solución, tal vez esto ayudará a alguien más. Encontré una forma sencilla de hacerlo en xml (a qué se refiere la respuesta de logcat). El truco que usé fue crear atributos personalizados para mis iconos de menú / acción. Debe tener un atributo por icono de elemento de menú.

Necesita crear attrs.xml en su carpeta de values y agregar sus atributos personalizados. Piense en cada atributo como una constante que sus temas / estilos establecidos y, a continuación, sus estilos / vistas pueden utilizar los contantes para establecer las propiedades.

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

En su styles.xml en su carpeta de values , tenga sus temas / estilos que establezcan sus atributos de iconos personalizados en referencias drawable .

 <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].xml en su carpeta de menu , [menu_name].xml que su elemento de menú defina su icono a su atributo de icono personalizado correspondiente.

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

Ahora, dependiendo del tema que se establezca, el icono del elemento de menú cambiará. Además, esto le permite tener aún versiones específicas de la API de sus drawables (luz y oscuridad) utilizando identificadores de recursos con sus carpetas drawable , por lo que puede tener diferentes iconos de estilo de menú para pre 3.0 y los iconos de estilo de barra de acción para 3.0+.

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

Creo que no recibió theming 🙂 Cuando usted está tratando de hacer:

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

Está intentando sobrecargar algún atributo en el tema con el nombre "@ drawable / action_search"

Tengo malas noticias para ti, creo que no hay tal cosa. Así que usted puede ir al tema Theme.Sherlock.ForceOverflow y sus padres y ver lo que puede sobrecargar.

Si nada te ayuda, y quieres tener un atributo personalizado en tu tema para diferentes iconos, es un tema diferente. Necesitas crear el atributo en attrs.xml, apuntar tu fuente del icono a este nuevo atributo y definir el valor del atributo en el tema. Para cada botón diferente.

Se resolvió, pero lo dejó para probarlo 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; } 

Ver res/xml/ic_search.xml en el blog AppCompat – Edad de los vectores (Chris Barnes)

Observe 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> 
  • Colores de Xamarin que causan errores de compilación
  • Color del fondo de la tostada que es cambiado
  • La barra de acción se ve cortada mientras se utiliza Theme.AppCompat.Dialog
  • Barra de herramientas de AppCompat popupTheme no se utiliza en ShareAction MenuItem
  • Cambiar grosor de la línea inferior de EditText cuando se envuelve en TextInputLayout
  • Fondo de la aplicación de Android: uso de múltiples imágenes
  • Tema Programáticamente establecido. Cómo volver a cargar Actividad para aplicar
  • Android Material recolorado Subtexto de EditText
  • ¿Definir el logotipo personalizado para ActionBar (diferente de Logo) en XML?
  • ActionBar con AppCompat actionBarItemBackground no funciona
  • Estilo de la casilla de verificación de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.