How to reference style attributes from a drawable? How to reference style attributes from a drawable? android android

How to reference style attributes from a drawable?


In my experience it is not possible to reference an attribute in an XML drawable.
In order to make your theme you need to:

  • Create one XML drawable per theme.
  • Include the needed color into you drawable directly with the @color tag or #RGB format.

Make an attribute for your drawable in 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>

Add your drawable to your theme.xml.

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

Reference your drawable in your layout using your attribute.

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


Starting with lollipop (API 21) this feature is supported, seehttps://code.google.com/p/android/issues/detail?id=26251

However, if you're targeting devices without lollipop, don't use it, as it will crash, use the workaround in the accepted answer instead.


Although it's not possible to reference style attributes from drawables on pre-Lollipop devices, but it's possible for color state lists. You can use AppCompatResources.getColorStateList(Context context, int resId) method from Android Support Library. The downside is that you will have to set those color state lists programmatically.

Here is a very basic example.

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>

A widget that needs a color state list:

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

And the most important:

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

Well, not the most elegant or shortest way, but this is what Android Support Library does to make it work on older versions (pre-Lollipop) of Android.

Unfortunately, the similar method for drawables doesn't work with style attributes.