Android StudioでDataBindingを使う

Android Developersサイトで[Data Binding Guild](https://developer.android.com/intl/ja/tools/data-binding/guide.html)が公開されています。でもバージョンが古いと怒られたり、AndroidStudioで作ったプロジェクがビルドエラーになったりと色々苦労がありました。そんな中でうまくいったバージョンの組み合わせがあったので、以下に上記サイトやAndroidStudioのデフォルト値との差分を書いておきます。

# 各種バージョン

いろいろなもののバージョンを書いておきます。

# AndroidStudio

1.3.2を使っています。

## Build Environment

AndroidStudioのプロジェクト直下のbuild.gradleでは、現時点での最新バージョンを指定しました。

```xml:/build.gradle
// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath "com.android.tools.build:gradle:1.3.1"
        classpath "com.android.databinding:dataBinder:1.0-rc2"
    }
}

allprojects {
    repositories {
        jcenter()
    }
}
```

appモジュール下のbuild.gradleでは、appcompatのバージョンを23から22に下げました。それに伴い、compileSdkVersionとtargetSdkVersionのバージョンも下げています。

```xml:/app/build.gradle
apply plugin: 'com.android.application'
apply plugin: 'com.android.databinding'

android {
    compileSdkVersion 22
    buildToolsVersion '23.0.1'

    defaultConfig {
        applicationId "red.itvirtuoso.databindingsample"
        minSdkVersion 15
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.2.0'
}
```

この組み合わせでビルドが通り、nexus 7 (ver 4.4.4)で動作確認できました。

# 苦労したところ

いろいろ苦労したことを書いておきます。

## レイアウトファイルについて

Androidで自動生成されるレイアウトファイルは、\<XxxxLayout\>タグがルートになっています。

```xml:AndroidStuidoが自動生成するレイアウトファイルの例
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context="red.itvirtuoso.databindingsample.Main2Activity">

    <TextView android:text="@string/hello_world" android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</RelativeLayout>
```

しかしDataBindingを使うときは、\<layout\>タグを用意して、その子供として\<XxxxLayout\>タグ、そしてバインドするクラスを指定する\<data\>タグを用意します。このとき、もともと\<XxxxLayout\>にあった名前空間の指定（xmlns:androidなど）は、\<layout\>タグに引っ越したほうがいいかもしれません。

```xml:DataBindingGuideにあるレイアウトファイルの例
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable name="user" type="red.itvirtuoso.databindingsample.User"/>
    </data>
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TextView android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.firstName}"/>
        <TextView android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.lastName}"/>
    </LinearLayout>
</layout>
```

## 生成されるBinding用のクラス名について

Data Binding Guidでは、レイアウトファイルから自動生成されるクラスは**MainActivityBinding**だと説明されています。しかしこのファイルは、レイアウトファイルの名前から決定されていて、AndroidStudioが作るレイアウトファイル名はactivity_main.xmlとなっているので、自動生成されるクラスは**ActivityMainBinding**となっていました。

# github

動作したソースをgithubで公開しておきます。
https://github.com/nakaken0629/DataBindingSample