Android attr到xml drawables

时间:2015-04-15 15:24:15

标签: android android-theme

TL; DR 我正在寻找public static Drawable getDrawableFromAttribute(Context context, String attrName)的实现。


我正在寻找一种方法,加载动态drawable,这是我的风格中定义的自定义属性。这是我的配置

attr.xml

<resources>
   <attr name="custom_image" type="reference">
</resources>

styles.xml

<resources>
   <style name="demo">
      <item name="custom_image">@drawable/fancy_picture</item>
   </style>
</resources>

fancy_picture 是一个名为 /res/drawables/fancy_pictures.xml

现在,我希望有人输入字符串&#34; custom&#34;和&#34;图像&#34;并且ImageView应该在其中显示fancy_picture。

最好的方法是什么?如果我使用XML-Layout文件,我可以写

<ImageView
    ...
    android:src="?custom_image"
    ...
    />

我没有在我的样式xml中使用 declare-styleable ,如果可能的话我想完全忽略它们。

1 个答案:

答案 0 :(得分:0)

我找到了一个解决方案

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public static Drawable getAttrDrawable(Context context, @AttrRes int attrRes) {
    Drawable drawable = null;
    TypedValue value = new TypedValue();
    if (context.getTheme().resolveAttribute(attrRes, value, true)) {
        String[] data = String.valueOf(value.string).split("/");
        int resId = context.getResources().getIdentifier(data[2].substring(0, data[2].length() - 4), "drawable", context.getPackageName());
        if (resId != 0) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                drawable = context.getDrawable(resId);
            } else {
                drawable = context.getResources().getDrawable(resId);
            }
        }
    }
    return drawable;
}

public static Drawable getAttrDrawable(Context context, String attr) {
    int attrRes = context.getResources().getIdentifier(attr, "attr", context.getPackageName());
    if (attrRes != 0) {
        return getAttrDrawable(context, attrRes);
    }
    return null;
}

它适用于attr - &gt; xml和attr - &gt; PNG。