Access resource defined in theme and attrs.xml android

android, attributes, drawable, resources, themes

Solution

I think you can get the Drawable with this code:

TypedArray a = getTheme().obtainStyledAttributes(R.style.AppTheme, new int[] {R.attr.homeIcon});     
int attributeResourceId = a.getResourceId(0, 0);
Drawable drawable = getResources().getDrawable(attributeResourceId);
a.recycle();

Problem

I have a scenario in which I want to set a `Drawable` depending upon the theme defined. To explain this further, Here is what I have in code: \res\values\attrs.xml ``` <resources> <declare-styleable name="AppTheme"> <attr name="homeIcon" format="reference" /> </declare-styleable> </resources> ``` res\values\styles.xml ``` <resources> <style name="AppTheme" parent="android:style/Theme"> <item name="attr/homeIcon">@drawable/ic_home</item> </style> </resources> ``` AndroidManifest.xml ``` <application android:label="@string/app_name" android:theme="@style/AppTheme"> <activity android:name=".MainActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> ``` So as you have noticed I am defining a custom attr homeIcon and setting the attribute value in AppTheme. When I define this attribute in a layout XML and try to access it it works smoothly ``` <ImageView android:id="@+id/img" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:src="?attr/homeIcon" /> ``` and renders the `Drawable` ic_home in an `ImageView`. But I am not able to figure out how to access the `Drawable` programmatically. I tried to do this with a work around, by defining a holder `LayerList Drawable`, which results in resource not found exception: ``` <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item android:drawable="?attr/homeIcon" /> </layer-list> ``` Summary I want to access the `Drawable` defined in a custom defined `Theme` programmatically.

Original source