Edited at
AndroidDay 10

Android Data Binding Tips

More than 1 year has passed since last update.


はじめに

Android Advent Calendar 2016 - Qiitaの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で以下のようなバインディングを行います。

(app:imageUrlに渡す値は適宜書き換えてください。)

<ImageView

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

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

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


include先にデータオブジェクトを渡す

レイアウトの再利用を目的として別のレイアウトファイルをincludeすることがあると思います。Data Bindingではinclude先にデータオブジェクトを渡すことが出来ます。

まずは、includeされる側で以下のようにデータオブジェクトの定義を書きます。

<layout>

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

(省略)
</layout>

次に、includeする側でデータオブジェクトを渡す処理を書きます。

<include

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

以上でinclude先にデータオブジェクトを受け渡すことが出来ます。


おわりに

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


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

  • include先にデータオブジェクトを渡す

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

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