DataBindingとは
レイアウトにデータを受け渡すことのできるGoogle公式ライブラリ。
本来であればViewを取得し、データを設定する必要があるが、DataBindingを使えば
ViewModelの値を変更するだけで直接レイアウトのプロパティにアクセスし、更新してくれる。
毎回Viewを取得する必要がなくなるため、ソース全体がスマートになる。
DataBindingの実装
appのbuild.gradleに以下を追加
android {
…
dataBinding {
enabled = true
}
}
レイアウトをDataBindingの形に変更
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="viewmodel"
type="~~(指定のパス)~~.MainViewModel"/>
</data>
...
<TextView
android:id="@+id/userName"
android:text="@{viewmodel.userName}"
... />
<TextView
android:id="@+id/userId"
android:text="@{viewmodel.userId}"
... />
...
</layout>
Bindingインスタンス取得
private var binding: MainFragmentBinding
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = MainFragmentBinding.inflate(inflater, container, false)
binding.lifecycleOwner = this
return binding.root
}
MainViewModelで変数に値をセット
userName = "キータ太郎"
userId = "12345"
このようにViewModelに紐付けてあげることによって、
MainViewModelでuserName、userIdの値が書き換えられると自動的にViewの値も更新される。
この場合はViewModelからViewにデータを渡したが、
ViewからViewModelに値を渡す場合は次のように書けば良い。
<TextView
android:id="@+id/userName"
android:text="@={viewmodel,userName}"
... />
<TextView
android:id="@+id/userId"
android:text="@={viewmodel.userId}"
... />
このように@=
としてあげることで、
View→ViewModelのデータの受け渡しを行うことができる。
関数の呼び出し
ボタンをクリックした際にこの関数を呼び出したい!というとき、
DataBindingは関数をも呼び出すことができる。
<Button
...
android:onClick="@{() -> viewModel.onClick()}"
... />
fun onClick() {
// クリックされた後の処理
}
このように書いてあげることで、
わざわざsetOnClickListener
でリスナーをセットをする必要がなくなる。
+α
ここまではViewとViewModelとのデータの受け渡し方法を説明してきた。
これらを活用すると、以下のようなことも行える。
<Button
...
android:enabled="@={viewmodel.frag}"
... />
var frag: Boolean = true
これは、MianViewModelの変数であるfrag
の値(true/false)によって、
ボタンの活性/非活性状態を切り替えるという場合に使える。
他にも、値によって表示するテキスト文字を変更することもできる。
この方法を活用することで、様々な場合で適用できる。
結論
DataBindingは便利すぎる。