web-dev-qa-db-ja.com

Androidサポートライブラリ:ベクトルかどうかに関係なくgetDrawableに依存しない

Android> = 5.0で作業する場合、

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

XMLを正しく解析し、有効なドローアブルを返します。しかし、新しい Vector Drawable Support Library (Version 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+プロジェクトで使用されましたか?サポートライブラリの記事には、この移行を実行する方法が記載されていません

23
PhilLab

次の方法を使用して、5.0より前のVectorDrawableのdrawableを取得できます。

Drawable drawable = AppCompatResources.getDrawable(mContext, mImageTitleResId);
45
Thinker Luffy

私は解決策を見つけました。

アクティビティにサポートVectorDrawableを手動で追加する必要があります。

あなたの活動でこれを試してください:

static {
    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}

詳細については、これを確認する必要があります ブログエントリ

7
jmarkstar

私がこれまでに見つけた別の可能な解決策

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

コンテキストはアクティビティである必要があります(ただし、アプリケーションコンテキストではありません)

1
orium