はじめに
今回はImageViewにDataBindingをする方法を解説していきます。
やりたかったこと
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@{iconId}"/>
こんな感じでImageViewにリソースIDをDataBindingをしたかったのですが、なぜか上手くいきませんでした。
改善
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:imageResource="@{iconId}"/>
これでできました!
なんでできないんだろうって考えていたんですが、公式のBindingAdapterを見て、そりゃできないなって思いました。
ちなみにこちらが既に用意されているBindingAdapterです。
Java
@BindingAdapter("android:src")
public static void setImageUri(ImageView view, String imageUri) {
if (imageUri == null) {
view.setImageURI(null);
} else {
view.setImageURI(Uri.parse(imageUri)); |
}
}
@BindingAdapter("android:src")
public static void setImageUri(ImageView view, Uri imageUri) {
view.setImageURI(imageUri);
}
@BindingAdapter("android:src")
public static void setImageDrawable(ImageView view, Drawable drawable) { |
view.setImageDrawable(drawable);
}
setImageResourceをしてくれるBindingAdapterはなかったんですね(笑)
そりゃできないわけだ、、、
ちなみに自作でBindingAdapterを作っても良さそうですね
作るとしたらこんな感じです
kotlin
@BindingAdapter("android:src")
fun ImageView.setImageResource(resourceId: Int) {
setImageResource(resourceId)
}
というかResourceIdをセットすることを最初から想定しておいてほしいです、Googleさん、、、、
最後に
ImageViewがバグって表示されていて、なんでだろうなぁと小1時間くらい消費してしまいました。
想定通りの挙動をしない場合は、裏側で何をやっているかちゃんと確認した方がいいということを学べたのでよかったです(笑)