〈kotlin〉MVVM③ LiveData
Android studioでkotlinを使ってAndroidアプリ作成の勉強中。
LiveData
ViewModel内でのデータの保存にLiveDataを使うことで
ライフサイクルに応じたデータの監視が可能になる。
(値が変更されたらその変更が検知されてUI上のデータも自動で変わる。)
実装
build.gradle
dependencies{
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.0"
}
LiveDataオブジェクトの作成
ViewModelにLiveDataオブジェクトを作成する。
class ViewModelSample : ViewModel(){ //バッキングプロパティを使う //内部で使用する変更可能なMutableLiveData private val _sampleData : MutableLiveData<String> = MutableLiveData<String>() //外部から参照するLiveData val sampleData : LiveData<String> = _sampleData //MutableLieDataを使って値を変更する処理を作成 fun setSampleData(){ _sampleData.value = "Sample" //LiveDataオブジェクトのデータにアクセスする時はvalueを使用 } }
LiveDataオブジェクトの監視
LiveDataが変更された時の処理を管理するObserverオブジェクトを作成する。
これをobserve() メソッドを使用して LiveData オブジェクトにアタッチすることで、
Observer オブジェクトが LiveDataに登録され、変更が通知されるようになる。
class MainActivity : AppCompatActivity() { private val model: ViewModelSample by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) .... val observer = Observer<String> { data -> dataTextView.text = data //データ変更時の処理 } model.sampleData.observe(this, observer) //fragmentで使用するときはthisをviewLifecycleOwnerにする } }
Databindingと一緒に使う
observe() メソッドは LifecycleOwnerと変更時の処理をLiveDataに設定しているが、
DataBindingと一緒に使う時はLifecycleOwnerを最初に設定し、変更時の処理はxmlファイルに直接記載する。
(上記のobserve()メソッドの部分が不要になる)
class MainActivity : AppCompatActivity() { private val model: ViewModelSample by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val binding: ActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main) binding.lifecycleOwner = this binding.viewModel = model } }
参考https://developer.android.com/topic/libraries/architecture/livedata