Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to reference style attributes from a drawable?

I want to have 2 selectable themes for my application. In order to do that, I defined some attributes, like this:

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

Then, I created both themes, like this:

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

This method works great, allowing me to create and modify several themes easily. The problem is that it seems that it can be used only in Views, and not in Drawables.

For example, referencing a value from a View inside a layout works:

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

But doing the same in a Drawable doesn't:

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

I get this error when running the application:

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

If instead of ?item_background I use a hardcoded color, it works, but that doesn't allow me to use my themes. I also tried ?attr:item_background, but the same happens.

How could I do this? And why does it work in Views but not in Drawables? I can't find this limitation anywhere in the documentation...

like image 450
MM. Avatar asked Nov 07 '11 19:11

MM.


People also ask

How do you reference a drawable Android?

Note: A color resource can also be used as a drawable in XML. For example, when creating a state list drawable, you can reference a color resource for the android:drawable attribute ( android:drawable="@color/green" ).

What is attr in Android?

The Attr interface represents an attribute in an Element object. Typically the allowable values for the attribute are defined in a schema associated with the document.

What is the preferred image format for the Drawables?

Supported file types are PNG (preferred), JPG (acceptable), and GIF (discouraged). App icons, logos, and other graphics, such as those used in games, are well suited for this technique.


1 Answers

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" /> 
like image 84
L. G. Avatar answered Sep 18 '22 15:09

L. G.