Android：Data Bindingメモ（Java to Kotlin）

ViewとCodeを関連付ける方法として
findViewById してたのを ButterKnife 使うようになって特に困ってなかったんですが

先日のDroidKaigi2016でDataBindingのお話を聞いて試そうと。
言語もKotlinがこれから良さそうだぞ。と

ButterKnife時代はViewHolderを自前で用意してましたが
BindingクラスがViewHolderの役割をやってくれるらしく
（但しRecyclerViewはRecyclerView.ViewHolder型のItemなのですが）

勉強がてらKotlinでDataBindingする記事を書きます。随時追記します。


# 環境
- Android Studio 2.1 Preview 4
- Kotlin Plugin 1.0.1
- SDK Updateで諸々最新に

# まずはJavaでData Binding
いきなりKotlinではなく
新規プロジェクト（Empty Activity）を作って、まずJavaでお試し

## Gradle設定
###  DataBindingを有効に
```
android {
    // 省略

    dataBinding {
        enabled true
    }
}
```

## Layout
- 元々のレイアウト全体をlayoutで囲って
- データクラスをdataに記述
- TextViewのtext属性にデータクラスのメンバを割当

この記述はKotlinになっても同じです。

```xml:activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<layout
	xmlns:android="http://schemas.android.com/apk/res/android"
	xmlns:tools="http://schemas.android.com/tools"
	>

	<data>
		<variable
			name="user"
			type="ssuzaki.databindingsample.User"/>
	</data>

	<RelativeLayout
		android:layout_width="match_parent"
		android:layout_height="match_parent"
		android:paddingBottom="@dimen/activity_vertical_margin"
		android:paddingLeft="@dimen/activity_horizontal_margin"
		android:paddingRight="@dimen/activity_horizontal_margin"
		android:paddingTop="@dimen/activity_vertical_margin"
		tools:context="ssuzaki.databindingsample.MainActivity">

		<TextView
			android:layout_width="wrap_content"
			android:layout_height="wrap_content"
			android:text="@{user._name}"/>
	</RelativeLayout>

</layout>
```

## データクラス
名前を保持するだけの簡単なものを用意。
ここで一旦リビルド

```java:User.java
public class User {
	private final String _name;

	public User(String name) {
		_name = name;
	}

	public String get_name() {
		return _name;
	}
}
```

## Activity
setContentViewのかわりにDataBindingUtil.setContentViewして
戻り値としてActivity名＋Bindingの名前でクラスが用意されるので
ActivityMainBindingクラス経由でテキストをUIへ反映すると

```java:MainActivity.java
public class MainActivity extends AppCompatActivity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);

		User user = new User("ssuzaki");
		binding.setUser(user);
	}
}
```

## 結果
反映されました

![shot.png](https://qiita-image-store.s3.amazonaws.com/0/76483/f6ce8872-af50-c558-ffeb-13ab74408f5c.png)


# これをKotlinで
Javaで作ったこれを今度はKotlinに。
（Kotlinプラグインの追加とかプロジェクトへの反映は省略）

## Kotlin用Gradle設定
[KotlinでData Bindingを使う時の設定](http://qiita.com/umetsu/items/487d38be86c31ff59075)　を参考に、BindingクラスをKotlinからも見えるようにおまじない

```
dependencies {
    // 省略

    kapt 'com.android.databinding:compiler:1.0-rc5'
}
kapt {
    generateStubs = true
}
```

## Layout
Kotlinになるから何を変えるわけでもなく
Java時代に作ったLayoutをそのまんま使います。

## Activity
Kotlin Pluginの機能でMainActivity.javaをMainActivity.ktへコンバート

```kotlin:MainActiity.kt
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)

        val user = User("ssuzaki")
        binding.user = user
    }
}
```

## データクラス
同様にデータクラスもKotlinへコンバート

```kotlin:User.kt
class User(val _name: String)
```

## 結果
同じです

![shot.png](https://qiita-image-store.s3.amazonaws.com/0/76483/f6ce8872-af50-c558-ffeb-13ab74408f5c.png)