Androidのxmlで画像がうまく読み込めずにハマった時のメモ
xmlで bitmap
タグを使って画像を読み込む際に以下のようなエラーが起きた場合と、9-patch画像がただの画像になってハマった時のメモ
Caused by: org.xmlpull.v1.XmlPullParserException: Binary XML file line #7: <bitmap> requires a valid 'src' attribute at android.graphics.drawable.BitmapDrawable.updateStateFromTypedArray(BitmapDrawable.java:851)
エラーが出た時の状況
my_drawable.xml
ファイルのルートに以下のような画像を設定していました。
<?xml version="1.0" encoding="utf-8"?> <bitmap xmlns:android="http://schemas.android.com/apk/res/android" android:src="@drawable/ic_launcher_round" />
ic_launcher_round
は以下の階層にあるpng画像とベクター画像でした。
mipmap/ ic_launcher_round.png mipmap-anydpi-v26/ ic_launcher_round.xml
エラーの原因と解決方法
bitmap
タグで設定した画像は BitmapDrawable
クラスとして表現され、jpegやpngなどの画像しか対応されておらず、今回の場合にAPI26以上ではベクター画像が使われるため、無効な画像として扱われていました。
解決方法の1つとして、API26以上の場合にもpng画像を使用する方法があります。他にも画像を使う側でAPIレベルによって処理を分けるという方法もあります。(使う画像を変えて対応するか、使う側の処理を分けて対応するか)
9-patch画像がただの画像として表示される問題
こちらも先ほどと原因は同じで、9-patch画像は NinePatchDrawable
に変換される必要があり、 BitmapDrawable
ではただのpng画像と同じ扱いになります。
解決方法として、 bitmap
ではなく nine-patch
タグを使用する方法があります。
参考
bitmap
タグなど、xmlをパースする時の処理
DrawableInflater.java - Source
Drawable
リソースのドキュメント
ドローアブル リソース | Android デベロッパー | Android Developers
Drawable
のリファレンス
Drawable | Android デベロッパー | Android Developers