2012-01-09 3 views
33

У меня есть сценарий, в котором я хочу установить Drawable в зависимости от определенной темы.Доступ к ресурсу, определенному в теме и attrs.xml android

Чтобы объяснить это дальше, вот что я имею в коде:

\ рес \ значения \ attrs.xml

<resources> 
    <declare-styleable name="AppTheme"> 
     <attr name="homeIcon" format="reference" /> 
    </declare-styleable> 
</resources> 

Рез \ значения \ 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> 

Как вы заметили, я определяю пользовательский attr homeIcon и устанавливаю значение атрибута в AppTheme.

Когда я определяю этот атрибут в XML макет и попытаться получить к нему доступ работает плавно

<ImageView android:id="@+id/img" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:src="?attr/homeIcon" /> 

и оказывает Drawable ic_home в качестве ImageView.

Но я не могу понять, как получить доступ к программному обеспечению Drawable.

Я пытался сделать это с работой вокруг, определяя держатель LayerList Drawable, что приводит ресурс не найден исключение:

<?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> 

Резюме Я хочу, чтобы получить доступ к Drawable, определенный в Пользовательский определенный Theme программно.

ответ

64

Я думаю, что вы можете получить вытяжку с этим кодом:

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(); 
+0

Пожалуйста, оцените его, если он работает на вас. – dmaxi

+0

Спасибо, это сработало! – Shardul

+0

Работал для меня ..! Благодаря! :) – DroidBee

9

Другим возможным способом сделать это:

public static int getResIdFromAttribute(final Activity activity,final int attr) 
    { 
    if(attr==0) 
     return 0; 
    final TypedValue typedvalueattr=new TypedValue(); 
    activity.getTheme().resolveAttribute(attr,typedvalueattr,true); 
    return typedvalueattr.resourceId; 
    } 

нет необходимости перерабатывать что-нибудь здесь ...

использование:

int drawableResId=getResIdFromAttribute(this,R.attr.homeIcon); 
Drawable drawable = getResources().getDrawable(drawableResId); 
+0

, это сработало для меня. , но почему нет необходимости перерабатывать? –

+1

@OlumideOyetoke Проверьте документы: http://developer.android.com/reference/android/util/TypedValue.html. Там нет функции рециркуляции ... –

1

Если вы используете поддержки/Библиотека проектирования простой способ получения вводимого коэффициента теперь -

Context.getDrawable(int) 

или

ContextCompat.getDrawable(Context, int) 

ссылка - https://plus.google.com/+BenjaminWeiss/posts/M1dYFaobyBM

2

Я использовал ниже метод, чтобы получить форму ID ресурса атрибут стиля. Затем он может использоваться для рисования, строки, измерения и так далее.

TypedArray typedArray = context.getTheme().obtainStyledAttributes(new int[] { R.attr.attrName }); 
int resourceId = typedArray.getResourceId(0, defaultResourceId); 
typedArray.recycle(); 

ура :-)

0

Вот результаты моего исследования, касающиеся этой темы. Если у нас есть declare-stylable, мы можем переопределить эти значения в темах.

До сих пор лучшим способом, которым я нашел, как их получить, является следующее.

TypedArray a = context.getTheme().obtainStyledAttributes(R.styleable.AppTheme); 
a.getDrawable(R.styleable.AppTheme_homeIcon); 

С помощью R.styleable.AppTheme_homeIcon мы ссылаемся именно тот атрибут, который мы хотим. Например, если у нас будет иметь несколько атрибутов, чем мы можем ссылаться на них следующим образом:

a.getColor(R.styleable.AppTheme_color,defaultValue); 
a.getDimension(R.styleable.AppTheme_width,defaultWidth); 

И если в текущей теме эти атрибуты не заданы, вы получите значения по умолчанию и без исключений.

Смежные вопросы