Skip to main content

androidでDataBinding + ViewModel + LiveDataを使ってみた

IntelliJ IDEA パーフェクトガイド

新品価格
¥3,278から
(2019/11/30 22:23時点)


そういえばやろうと思っていて放置してた
DataBinding + ViewModel + LiveDataをやってみた


・やりたいこと
ViewModelを更新するとViewの表示が更新されるようにしたい
setText等はやらずに変数のデータ更新するイメージ

・コード

MainActivity.kt

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding: ActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)

        val viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
        binding.lifecycleOwner = this
        binding.viewModel = viewModel

        binding.editText.addTextChangedListener(object : TextWatcher {
            override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
            }

            override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
                viewModel.text.postValue(s?.toString())
            }

            override fun afterTextChanged(s: Editable?) {
            }

        })
    }
}

MainViewModel.kt

class MainViewModel : ViewModel() {
    val text = MutableLiveData<String>()
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>

<layout>

    <androidx.constraintlayout.widget.ConstraintLayout 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"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

        <EditText
            android:id="@+id/editText"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@id/textView" />


        <TextView
            android:id="@+id/textView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@{viewModel.text}"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

    </androidx.constraintlayout.widget.ConstraintLayout>

    <data>

        <variable name="viewModel" type="com.example.twice.binding.MainViewModel" />
    </data>
</layout>

・参考
https://qiita.com/YusukeIwaki/items/3fb4e10ac87fa1c7f6ba

関連記事:

Pocket