Access resource defined in theme and attrs.xml android

 ̄綄美尐妖づ 提交于 2019-11-27 18:31:16
dmaxi

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

Another possible way to do it:

  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;
    }

Or in Kotlin:

@JvmStatic
fun getResIdFromAttribute(activity: Activity, attr: Int): Int {
    if (attr == 0)
        return 0
    val typedValue = TypedValue()
    activity.theme.resolveAttribute(attr, typedValue, true)
    return typedValue.resourceId
}

no need to recycle anything here...

usage:

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

I used below method to get resource id form style attribute. Then it can be used for drawable, string, dimension so on.

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

cheers :-)

If you are using support / design library easier way to get drawables now is -

Context.getDrawable(int)

or

ContextCompat.getDrawable(Context, int)

reference - https://plus.google.com/+BenjaminWeiss/posts/M1dYFaobyBM

Here are the results of my investigation, regarding this topic. If we have declare-stylable then we can override those values in themes.

So far the best way that I found how to get them is the following.

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

By using R.styleable.AppTheme_homeIcon we are referencing exactly that attribute that we want. For example if we would have few more attributes, then we can reference them as follows:

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

And if in current theme those attributes were not defined you will get default values and no Exceptions.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!