LoginSignup
24
15

More than 5 years have passed since last update.

Support Vector Drawable対応で使うapp:srcCompatをdatabinding使用箇所でも使いたい

Last updated at Posted at 2016-04-15

Support Vector Drawableについて

Vector Drawable対応そのものについては以下の資料が非常に参考になりますのでよくわからない方は御覧ください。

Data Bindingについて

Data Bindingについては、Android Developersの公式ガイドを御覧ください。

本題

問題

Data Bindingガイドを読むと、drawableをandroid:src="@{@drawable/image}"のように指定するかと思います。

そのあと、Support Vector Drawable対応しようとしてapp:srcCompat="@{@drawable/image}"とreplaceすると、ビルドに失敗します。

Cannot find the setter for attribute 'app:srcCompat' with parameter type android.graphics.drawable.Drawable. 

Drawableのsetterがapp:srcCompatにないと言われます。

解決方法

まず、当該xmlにcom.example.Rをimportします。com.exapmleの部分は適宜Package名に置き換えてください。

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <data>
        <import type="com.example.R" />
        .....
    </data>
    ....
</layout>

drawableの指定方法をapp:srcCompat="@{R.drawable.image}のように変更します。

最後に適当なクラスのstaticメソッドとしてsrcCompatのBindingAdapterを定義します。

@BindingAdapter("srcCompat")
public static void srcCompat(ImageView view, int resourceId) {
    view.setImageResource(resourceId);
}

以上でビルドして利用することができます。

ちなみに、上記の場合はdrawableが固定なのでData Bindingを使わなくてもよくて、実際にはこのような時に効果が発揮されます。

app:srcCompat="@{item.isA ? R.drawable.imageA : R.drawable.imageB}"
24
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
15