LoginSignup
1
0

More than 3 years have passed since last update.

ViewModel + DataBinding で文字数をカウント

Posted at

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()
    }
}

実行結果

サンプルコード

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0