Index
超ざっくり説明すると、UIを呼び出す時にfindViewById()を使わずに呼び出せるようになるライブラリのこと。
ソースコードの見通しが良くなったり、コード量を削減できます。
詳しくは公式のドキュメントを参照してください。
超ざっくり説明すると、データが更新されるたびにUIに通知を送って、自動でUIを更新してくれるようになるデータホルダー クラスです。
詳しくは公式のドキュメントを参照してください。
codeLabを元に
ボタンを押すとカウントアップされる簡単なアプリを作ってみましょう。
TextView、Buttonだけのすごく簡単なActivityです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
<?xml version="1.0" encoding="utf-8"?> <layout 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"> <!-- dataBinding用の記述 --> <data> <variable name="viewModel" type="com.example.databinding.CountViewModel"/> </data> <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <!--カウント数表示用--> <TextView android:id="@+id/count" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(viewModel.count)}"<!--countViewModel.ktの変数を参照する--> app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <!--カウントアップ用ボタン--> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text = "count up" android:onClick="@{() -> viewModel.onCountUpButtonClick()}"<!--countViewModel.ktの関数を参照する--> app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@id/count" /> </androidx.constraintlayout.widget.ConstraintLayout> </layout> |
肝となるのは、以下の記述。
1 2 3 4 5 |
<data> <variable name="viewModel" type="com.example.databinding.CountViewModel"/> </data> |
dataBindinするときのお作法のようなものです。
ここでの意味は「CountViewModel.kt」で定義されている変数や関数にviewModelという名前でアクセスできるようにしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
package com.example.databinding import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import androidx.databinding.DataBindingUtil import androidx.lifecycle.ViewModelProvider import com.example.databinding.databinding.ActivityMainBinding class MainActivity : AppCompatActivity() { //CountViewModel.ktを取得する private val viewModel by lazy{ViewModelProvider(this).get(CountViewModel::class.java)} override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) //dataBindingするときのおまじない val binding:ActivityMainBinding = DataBindingUtil.setContentView(this,R.layout.activity_main) //以下2行はlivedataを使うときのおまじない binding.lifecycleOwner = this binding.viewModel = viewModel } } |
以下のコードは
activity_main.xmlの<data> </data>の中で宣言したレイアウト変数を設定するために必要な記述です。(dataBinding)
バインディングクラスは、ライブラリによって自動的に生成されます。
1 2 3 |
//dataBindingするときのおまじない val binding:ActivityMainBinding = DataBindingUtil.setContentView(this,R.layout.activity_main) |
以下のコードはおまじないとして覚えていても最初は問題ないと思います。
lifecycleOwnerについてはあまり理解できていないので、ドキュメントを参照してください。
lifecycleを管理していそう。
1 2 3 |
//以下2行はlivedataを使うときのおまじない binding.lifecycleOwner = this binding.viewModel = viewModel |
LiveDataを使った記述をしているので、解説していきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
package com.example.databinding import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel class CountViewModel : ViewModel() { private val _count = MutableLiveData(0) val count:LiveData<Int> = _count fun onCountUpButtonClick() { _count.value = (_count.value ?: 0) + 1 } } |
livedataを使って値を監視するときは以下のように、1つの変数につき2行のコードが必要になります。
MutableLiveData()の引数が初期値になります。
詳細は公式のドキュメントを参照してください。
1 2 |
private val _count = MutableLiveData(0) val count:LiveData<Int> = _count |
あとはクラス内で以下のように自由にアクセスできます。
サンプルでは_countが変化するたびに勝手にUIに反映されます!
1 2 3 |
fun onCountUpButtonClick() { _count.value = (_count.value ?: 0) + 1 } |