2015-04-15 64 views
1

TL; DR我在尋找public static Drawable getDrawableFromAttribute(Context context, String attrName)的實現。Android attr to xml drawables


我正在尋找一種方法來加載動態繪圖,這是在我的樣式中定義的自定義屬性。這是我的配置

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

現在,我希望有人輸入字符串「custom」和「image」,並且ImageView應該在其中顯示fancy_picture。

這樣做的最好方法是什麼?如果我使用一個XML的佈局文件,我可以寫

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

我沒有用聲明,設置樣式在我的風格XML,我想完全忽略他們,如果可能的。

回答

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 - > XML和attR - > PNG。