DataBinding サンプルの続編
Kotlin DataBinding メモ
ここと同様にプロジェクトを作成し、ライブラリ&クラスをロード。
View 編集
テキスト入力欄と文字数を表示するTextViewを配置。双方向では@={vm.name}のように@の後ろに=をつける。
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="viewModel" type="com.example.kotlindatabindingsample2.viewmodel.MainViewModel"/>
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.kotlindatabindingsample2.MainActivity">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@={viewModel.messageEditText}" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@={viewModel.messageLength}" />
</LinearLayout>
</layout>
ViewMoel作成
MainViewMoedl.kt
package com.example.kotlindatabindingsample2.viewmodel
import androidx.databinding.BaseObservable
import androidx.databinding.Bindable
import androidx.databinding.library.baseAdapters.BR
class MainViewModel: BaseObservable() {
var messageEditText: String = ""
set(value) {
field = value
notifyPropertyChanged(BR.messageLength)
}
@Bindable
var messageLength: String = "0"
get() = "${messageEditText.length}"
}
@Bindableをつけることにより、監視用の定数BR.が生成されます。
呼び出し側へnotifyPropertyChanged(BR.)を追加し、BR.に対応するget()が呼ばれるようにします。
SwiftでいうComputed Propertyっぽく書ける。 notifyPropertyChangedメソッドは更新が通知する。
messageEditTextに値が入ったときに、そのことをmessageLengthへ通知する。
MainActivity
viewModelセット。
MainActivity.kt
package com.example.kotlindatabindingsample2
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.databinding.DataBindingUtil
import com.example.kotlindatabindingsample2.databinding.ActivityMainBinding
import com.example.kotlindatabindingsample2.viewmodel.MainViewModel
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val binding: ActivityMainBinding =
DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
binding.viewModel = MainViewModel()
}
}