13

當與Android> = 5.0的工作,的Android支持庫:getDrawable獨立如果載體或不

Drawable d = getResources().getDrawable(R.drawable.icon) 

正確解析XML返回有效繪製。但是當使用新的Vector Drawable Support Library(版本23.4,Gradle 2.1.2)時,此代碼在Android 4下崩潰。

android.content.res.Resources $ NotFoundException

...

造成的:org.xmlpull.v1.XmlPullParserException:二進制XML文件行#2:無效的繪製標籤矢量

該解決方案將是使用

Drawable d = VectorDrawableCompat.create(getResources(), R.drawable.icon, null); 

但這會崩潰,如果資源不是矢量資源:

java.io.FileNotFoundException:損壞的XML二進制文件

所以不得不來代替在第一行的是什麼代碼,以便它適用於Android 4和Android 6以及矢量和非矢量繪圖 - 例如在所有情況下,這條線用於Android 5.0+項目中?支持庫文章沒有提及執行此遷移的方法

+0

我認爲他們期待開發商鋒線資源是否知道是一個可繪製的矢量或不是。這對於應用程序開發人員來說是合理的,對於圖書館開發人員來說更是如此關閉袖口,我會嘗試'VectorDrawableCompat',如果出現'FileNotFoundException',則回退到'getDrawable()'。 – CommonsWare

回答

4

我找到了解決方案。

您需要手動在您的活動中添加支持VectorDrawable。

試試這個在您的活動:

static { 
    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); 
} 

您應該檢查這個blog entry以獲取更多信息。

+4

謝謝,這工作。僅供參考,它是''setCompatVectorFromResourcesEnabled()',博客文章有一個錯字。 – PhilLab

30

您可以使用以下方法在5.0之前獲取Vector Drawable的drawable。

Drawable drawable = AppCompatResources.getDrawable(mContext, mImageTitleResId); 
+0

支持lib 24.2.x. –

+0

非常感謝!幫助我們修復了在5.0版本的設備上使用矢量繪圖時在我們的應用程序中始終發生的崩潰。 –

+0

這應該是答案。 – Sakiboy

1

另一種可能的解決方案是我迄今發現

ResourcesCompat.getDrawable(context.resources, resId, theme) 

和內容應該是你的活動(而不是應用程序上下文)