2014-09-29 44 views
1

因此,根據Android文檔,Resources.getDrawable()在Jelly Bean之前有一個操作系統版本的已知錯誤,其中別名drawables將無法用正確的密度解析(所以100px在繪製 - 華電國際形象得到縮放爲150像素的華電國際設備上):如何使用TypedArray獲取Drawable(帶有可繪製別名)

注:此前JELLY_BEAN,此功能將無法正常時檢索資源ID在這裏通過了最終的配置密度是一個別名到另一個可繪製資源。這意味着如果別名資源的密度配置與實際資源不同,則返回的Drawable的密度將不正確,從而導致縮放不良。要解決此問題,您可以通過TypedArray.getDrawable檢索Drawable。將Context.obtainStyledAttributes與包含感興趣的資源ID的數組一起使用來創建TypedArray。

但是,我沒有能夠使用指定的指令實際解決Drawable。我已經寫了一個實用的方法:

<item name="my_drawable" type="drawable">@drawable/my_drawable_variation</item> 

是:

@NonNull 
public static Drawable resolveDrawableAlias(@NonNull Context ctx, @DrawableRes int drawableResource) { 
    final TypedArray a = ctx.obtainStyledAttributes(new int[] { drawableResource }); 
    final Drawable result = a.getDrawable(0); 
    a.recycle(); 
    return result; 
} 

當我傳遞一個資源ID被拉伸的別名,這是我在res/values/drawables.xml已經定義爲始終返回null有什麼我在這裏失蹤,或其他解決方法?

編輯:我在下面添加了一個解決方案。

+2

這可能是由「資源別名」在這裏,他們的意思''每:HTTP://開發商.android.com/guide/topics/resources/provide-resources.html#AliasResources此外,您不會將可繪製資源的ID傳遞給'obtainStyledAttributes',而是將屬性ID:http:// developer。 android.com/reference/android/content/res/Resources.Theme.html#obtainStyledAttributes%28int[]%29 – CommonsWare 2014-09-29 18:24:48

+0

@CommonsWare嗯,嗯。那可能是。如果是這樣,可能沒有好的解決方法,我需要什麼(我不能使用位圖別名,因爲目標是另一個Drawable - 不是直接位圖)。 – kcoppock 2014-09-29 18:26:08

回答

1

好吧,我已經找到了以下解決方案,這似乎這樣的伎倆:

/** 
* Method used as a workaround for a known bug in 
* {@link android.content.res.Resources#getDrawable(int)} 
* where the density is not properly resolved for Drawable aliases 
* on OS versions before Jelly Bean. 
* 
* @param ctx a context for resources 
* @param drawableResource the resource ID of the drawable to retrieve 
* 
* @return the Drawable referenced by drawableResource 
*/ 
@NonNull 
public static Drawable resolveDrawableAlias(@NonNull Context ctx, @DrawableRes int drawableResource) { 
    final TypedValue value = new TypedValue(); 

    // Read the resource into a TypedValue instance, passing true 
    // to resolve all intermediate references 
    ctx.getResources().getValue(drawableResource, value, true); 
    return ctx.getResources().getDrawable(value.resourceId); 
} 
相關問題