KotlinでDataBinding+ViewModel

初投稿になります。Androidの便利な機能であるDataBindingとViewModelの基本的な扱いに関してまとめていきたいと思います。
学習途中でまとめているので順次更新していきたいと思っています。

# DataBinding
### 下準備
まずはDataBindingを使用するためにgradleファイルへの書き込みをおこないます。

```kotlin:build.gradle
android {
    dataBinding {
        enabled = true
    }
}
```

### レイアウトxmlの準備
Layoutのxmlの準備をしていきます。

```xml:main_fragment.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable name="data" type="com.example.test.main.MainViewModel" />
    </data>
    <android.support.constraint.ConstraintLayout
            android:id="@+id/container"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
        <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/textView"
                android:text="@{data.text}"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent"
                app:layout_constraintBottom_toBottomOf="parent"/>
    </android.support.constraint.ConstraintLayout>
</layout>
```

こちらには少し注意点があります。
・**親のレイアウトはlayoutであること。**
・こちら一度書き込んだあとbuildしないとdatabindingをする際に自動的に作成されるファイルがないとエラーが出るので**buildをしてから実行**します。

ではこちらのファイルの説明をしていきます。

まずは<data>の部分です。
こちらはnameの部分が変数名、typeの部分が参照するクラス名と考えるのがわかりやすいかなと思います。
今回はname="data"として使用しています。参照しているViewModelは後述していきます。

TextViewを見てみると

android:text="@{data.text}"

という箇所があります。ここが**textとdata.textをBinding(紐付け)している箇所**になります。
ここではtextにMainViewModel内の変数textを表示するようにBindingを行なっています。

###ViewModel

ViewModelは先ほど定義したMainViewModelを使用します。

中身はこんな感じです。

```kotlin:MainViewModel.kt
class MainViewModel : ViewModel() {
    val text: MutableLiveData<String> = MutableLiveData()
    init {
        text.value = "aaa"
    }
}
```

textにはLiveDataを使用しています。
[LiveDataに関してはこちらを参照](https://developer.android.com/topic/libraries/architecture/livedata)
text.valueに初期値を設定することで、その値がLayout内にも反映がされます。

### Fragment
最後にFragmentです。

```kotlin:Mainfragment.kt
class MainFragment : Fragment() {
    private var binding: MainFragmentBinding? = null
    private var mainViewModel: MainViewModel? = null

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        binding = MainFragmentBinding.inflate(inflater, container, false)
        binding!!.lifecycleOwner = this

        return binding!!.root
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        mainViewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
        binding!!.data = mainViewModel
    }
}
```

これでDataBindingの使用ができます。

onCreateView内を見てみます。
`binding = MainFragmentBinding.inflate(inflater, container, false)`
ここはBindingのインスタンスの取得をしています。
返すViewには`binding!!.root`を指定してください。

そしてonActivityCreated内です。
`mainViewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)`
ここでViewModelのインスタンスを取得しています。
`binding!!.data = mainViewModel`
ここのdataはmain_fragment.xmlでname="data"として設定した名前になります。

---

間違いありましたらご指摘お願いします。
追々肉付けしていけたらと思います。