¿Cómo referenciar los atributos de estilo de un drawable?

Quiero tener 2 temas seleccionables para mi aplicación. Para ello, definí algunos atributos, como este:

<attr format="color" name="item_background" /> 

Entonces, creé ambos temas, como esto:

  <style name="ThemeA"> <item name="item_background">#123456</item> </style> <style name="ThemeB"> <item name="item_background">#ABCDEF</item> </style> 

Este método funciona muy bien, lo que me permite crear y modificar varios temas fácilmente. El problema es que parece que sólo se puede utilizar en Views y no en Drawables .

Por ejemplo, hacer referencia a un valor desde una vista dentro de un diseño funciona:

  <TextView android:background="?item_background" /> 

Pero hacer lo mismo en un Drawable no:

  <shape android:shape="rectangle"> <solid android:color="?item_background" /> </shape> 

Consigo este error al ejecutar la aplicación:

  java.lang.UnsupportedOperationException: Can't convert to color: type=0x2 

Si en lugar de ?item_background uso un color codificado, funciona, pero eso no me permite usar mis temas. También intenté ?attr:item_background , pero sucede lo mismo.

¿Cómo podría hacer esto? ¿Y por qué funciona en Views pero no en Drawables? No puedo encontrar esta limitación en ningún lugar de la documentación …

En mi experiencia no es posible hacer referencia a un atributo en un xml dibujable.
Para hacer su tema usted necesita:

  • Cree un xml dibujable por tema.
  • Incluya el color necesario en usted dibujable directamente con la etiqueta @color o el formato #RGB.

Haz un atributo para tu drawable en attrs.xml .

 <?xml version="1.0" encoding="utf-8"?> <resources> <!-- Attributes must be lowercase as we want to use them for drawables --> <attr name="my_drawable" format="reference" /> </resources> 

Agregue su drawable a su theme.xml .

 <style name="MyTheme" parent="@android:style/Theme.NoTitleBar"> <item name="my_drawable">@drawable/my_drawable</item> </style> 

Haga referencia a su dibujable en su diseño utilizando su atributo.

 <TextView android:background="?my_drawable" /> 

Comenzando con lollipop (API 21), esta función es compatible, consulte https://code.google.com/p/android/issues/detail?id=26251

Sin embargo, si está dirigiendo dispositivos sin lollipop, no lo use, ya que se bloqueará, utilice la solución en la respuesta aceptada.

Aunque no es posible hacer referencia a los atributos de estilo de drawables en dispositivos pre-Lollipop , pero es posible que las listas de estado de color. Puede utilizar el método AppCompatResources.getColorStateList (Context context, int resId) de la Biblioteca de soporte de Android. La desventaja es que usted tendrá que fijar esas listas del estado del color programmatically.

Aquí hay un ejemplo muy básico.

Color / my_color_state.xml

 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_checked="true" android:color="?colorControlActivated" /> <item android:color="?colorControlNormal" /> </selector> 

Un widget que necesita una lista de estado de color:

 <RadioButton android:id="@+id/radio_button" android:text="My Radio" /> 

Y lo mas importante:

 ColorStateList csl = AppCompatResources.getColorStateList(context, R.color.my_color_state); RadioButton r = (RadioButton) findViewById(R.id.radio_button); r.setTextColor(csl); 

Bueno, no es la forma más elegante o más corta, pero esto es lo que hace la Biblioteca de Soporte de Android para que funcione en las versiones anteriores (pre-Lollipop) de Android.

Desafortunadamente, el método similar para drawables no funciona con atributos de estilo.

Como @marmor dijo que ahora es compatible con la API 21. Pero para aquellos que necesitamos soportar versiones anteriores de Android, puede utilizar esta función. Utilizando la biblioteca de soporte v7, todavía puede usarla en aplicaciones con un nivel mínimo de SDK hasta el 7.

AppCompatImageView en la Biblioteca de soporte de Android de v7 tiene una implementación sin errores de esta característica. Simplemente reemplace sus usos de ImageView con AppCompatImageView .

  • Respecto a la eliminación de la barra de título de actividad en Android
  • Actividad temática de diálogo: botones positivos y negativos
  • Style Android SearchView Desplegable popup
  • Estilo de diálogo de preferencias de Android
  • Layout_width y layout_height no se está aplicando a edittext desde el tema
  • Quitar sombra de barra de acción mediante programación
  • ¿Cuál es la diferencia entre windowBackground y el fondo para el estilo de las actividades?
  • Establecer la gravedad del título en el centro de ActionBarSherlock
  • Cambiar el teclado Android L introduzca el color de la tecla
  • Cómo cambiar el color predeterminado en todos los textos en mi aplicación de Android?
  • ¿Por qué un botón pierde su comportamiento original después de cambiar su color?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.