〈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