〈kotlin〉MVVM① DataBinding

Android studioでkotlinを使ってAndroidアプリ作成の勉強中。

MVVMとは

「Model」「View」「ViewModel」の3層に分けて実装するアーキテクチャらしい。
調べると解説記事がたくさん出てきた。簡単にするとこんな感じ?

Model データリソースを管理する部分
View UIに関する部分(Activity, Fragment, xmlファイル)
ViewModel ModelとViewをつなぐ部分
Modelからデータを取得してViewに表示するデータを作る

DataBinding

ViewModelからViewにデータの受け渡す方法としてDataBindingがある。

Activityで定義する場合、 findViewById()でxmlに指定したフレームワークを呼び出して値を代入する。

findViewById<TextView>(R.id.sample_text).apply {
    text = viewModel.userName
}

DataBindingを使用するとレイアウトファイル内で直接割り当てができる。

<TextView
    android:text="@{viewmodel.userName}" />

実装

build.gradle

DataBindingを使用できるよう記述を追加。

plugins{
    ...
    id 'kotlin-kapt'
}

android {
    ...
    dataBinding {
        enabled = true
    }
}
XMLファイル

Layoutタグをルートタグとして記述する(はじめのConstraintLayoutのままではだめ)。
そのあとにdataタグとViewの要素のタグを書いていく。
dataタグの中にバインドするデータの記述をする。

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
   <data>
       <variable name="user" type="com.example.User"/>
        //nameにxml内で使用する変数名を指定する
        //typeに型を指定する、自分で作ったクラスも入れられる
   </data>
   <LinearLayout
       ...
        <TextView android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@{user.firstName}"/>
           //@{}とdataタグで指定した変数名を使って値を埋め込む
   </LinearLayout>
</layout>

typeに指定したUserのオブジェクト

data class User(val firstName: String, val lastName: String)
Activity内

レイアウトファイルごとに作成されるバインディングクラスによって
レイアウトへのバインディングが保持される。
(activity_main.xmlに対してActivityMainBindingというバインディングクラスができる)

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    val binding: ActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)

    binding.user = User("Test", "User")
}

Fragment、ListView、RecyclerViewで使用している場合は
inflate()メソッドを使用してバインディングを取得する。

val listItemBinding = ListItemBinding.inflate(layoutInflater, viewGroup, false)
    // or
val listItemBinding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false)


とりあえずここまで。
参考https://developer.android.com/topic/libraries/data-binding?hl=ja