lifecycleOwnerのセットを忘れるとデータバインディングが連動しない
LiveData
を持ったViewModel
を使ってデータバインディングを使う場合、Fragment
で
以下のようにViewModel
とレイアウトを紐づける。
参考: 【Android,Kotlin】双方向・単方向データバインディングの実装手順
class FooFragment : Fragment() {
private var binding: FragmentFooBinding? = null
private val viewModel: FooViewModel by viewModels()
override fun onCreateView(...): View? {
binding = FragmentFooBinding.inflate(inflater, container, false)
binding?.lifecycleOwner = this // この行が必要!!
binding?.viewModel = viewModel // ビューモデルを設定
return binding?.root
}
}
以上のうちの以下の部分について、
// (1) bindingの生成
binding = FragmentFooBinding.inflate(inflater, container, false)
// (2) Fragmentのライフサイクルに連動させる
binding?.lifecycleOwner = this
// (3) ビューモデルを設定
binding?.viewModel = FooViewModel()
(1)と(3)は「レイアウトとViewModel
を紐づけよう」という気持ちで書いているので忘れることはないが、
(2)は抜けがち。
「エラーは出ないけどViewModel
に設定した値が画面に反映されない」という状況に遭遇したら、
lifecycleOwner
で該当画面と連動させるのを忘れていないかを確認する。
\確かな知識を身に着けたい、Androidアプリ開発を学びたい人にオススメ!/