Android Data Binding Tips

これはAndroid Advent Calendar 2016の10日目の記事です。

はじめに

Data Binding使ってますか?便利ですよね。私も個人でも仕事でも使っています。

今回の記事ではData BindingのTipsをいくつか紹介したいと思います。

カスタムバインディングを定義する

Data Bindingはデータオブジェクトの値をViewに反映するためのものですが、標準で用意されているバインディングだけではちょっと物足りません。例えば、GlideやPicassoを使ってImageViewに画像を表示するようなユースケースでは、カスタムバインディングを定義する必要があります。

Data Bindingでは以下のようにBindingAdapterを使ってカスタムバインディングを定義します。

public class CustomBinder {
    @BindingAdapter("app:imageUrl")
    public static void imageUrl(ImageView imageView, String url) {
        Glide.with(imageView.getContext()).load(url).into(imageView);
    }
}

上記のようなカスタムバインディングを定義した上で、XMLで以下のようなバインディングを行います。

<ImageView
    android:layout_width="100dp"
    android:layout_height="100dp"
    app:imageUrl="@{article.thumbnail()}"/>

今回はImageViewに対して画像URLをバインドする方法を紹介しましたが、これを応用すれば基本的には何でもバインドすることが出来ます。が、あまりにアクロバティックなバインディングを行うと後からプロジェクトにジョインした人が困るので、用法用量を守って使いましょう。

ちなみにカスタムバインディングの悪用事例は以下の記事で紹介されています。

Includeタグにデータを渡す

レイアウトの再利用を目的として別で定義されたレイアウトファイルを挿入することがあると思います。Data BindingではIncludeタグでデータオブジェクトを渡すことが出来ます。

まずは、再利用される側で以下のようにデータの定義を書きます。

<layout>
    <data>
        <variable
            name="article"
            type="com.yuyakaido.android.flow.domain.entity.Article"/>
    </data>

    (省略)
</layout>

次に、再利用する側でデータを渡す処理を書きます。

<include
    layout="@layout/include_item_article"
    app:article="@{article}"/>

おわりに

今回は以下の2つのTipsを紹介しました。

どちらもある程度な規模のアプリを開発する上で必要になってくるかなと思います。

それでは、良いData Bindingライフを!