Androidのxmlで画像がうまく読み込めずにハマった時のメモ

xmlbitmap タグを使って画像を読み込む際に以下のようなエラーが起きた場合と、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 クラスとして表現され、jpegpngなどの画像しか対応されておらず、今回の場合に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