theme temas studio para estilos ejemplos ejemplo descargar definicion body atributos atributo android android-drawable android-theme android-attributes

android - temas - ¿Cómo hacer referencia a los atributos de estilo de un dibujable?



theme editor android studio (4)

Aunque no es posible hacer referencia a los atributos de estilo de los objetos dibujables en dispositivos anteriores a Lollipop , sí es posible utilizar listas de estado de color. Puede usar el método AppCompatResources.getColorStateList (Context context, int resId) de la Biblioteca de soporte de Android. El inconveniente es que tendrá que establecer esas listas de estado de color mediante programación.

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 de la manera más elegante o más corta, pero esto es lo que hace la Biblioteca de soporte de Android para que funcione en versiones anteriores (anteriores a Lollipop) de Android.

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

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

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

Entonces, creé ambos temas, así:

<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 solo se puede usar en Vistas, y no en Dratables .

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>

Me sale este error al ejecutar la aplicación:

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

Si en lugar de ?item_background utilizo un color codificado, funciona, pero eso no me permite usar mis temas. También probé ?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 ...


Comenzando con lollipop (API 21) esta característica es compatible, consulte code.google.com/p/android/issues/detail?id=26251

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


Como @marmor declaró que esto ahora es compatible con API 21. Pero para aquellos que necesiten soportar versiones heredadas de Android, puedes usar esta característica. Con la biblioteca de soporte de v7, puede usarlo en aplicaciones con un nivel mínimo de SDK hasta 7.

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


En mi experiencia, no es posible hacer referencia a un atributo en un xml drawable.
Para hacer tu tema necesitas:

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

Haz un atributo para tu dibujo 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 dibujable 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 dibujo en su diseño utilizando su atributo.

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