¿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:
- Cambiar el fondo popupMenu en Android
- Herencia de estilo de Widget extendido
- Establecer Android Theme.Light para diálogo de alerta
- Cambiar el tamaño del texto del botón de diálogo de Android a través de estilos
- Android cómo obtener AppCompat.Translucent tipo de tema con barra de acción de apoyo?
<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 …
- Texto oscuro sobre fondo oscuro en AlertDialog con Theme.Sherlock.Light
- ¿Cómo puedo aplicar el tema android de HoloEverywhere cuando se usa ActionBarSherlock?
- El cambio de tema no funciona en <4.0 como debería
- Cómo cambiar el color de la barra de herramientas de selección de texto que viene cuando copiamos un texto?
- Cambio del borde de enfoque de EdiciónTexto
- Cómo hacer aplicaciones hermosas y con estilo como Timely
- Lollipop Barra de progreso Tinción
- El tema Holo no se aplica a los diálogos cuando se utiliza la biblioteca holoeverywhere
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
.