Android Kotlin基礎講座 05.3: ViewModelとLiveDataのデータバインディング

Android Kotlin基礎講座

まとめ

  • データバインディングライブラリはViewModelやLiveDataなどのAndroidアーキテクチャコンポーネントを用いてシームレスに動作します。
  • アプリのレイアウトは、これまでUI controllerのライフサイクルおよびデータの変更の通知を管理するために活用してきたアーキテクチャコンポーネントのデータに結び付けることができます。

ViewModel データバインディング

  • データバインディングを用いてViewModelをレイアウトと紐づけることができます。
  • ViewModelオブジェクトはUIデータを保持します。ViewModelオブジェクトをデータバインディングに渡すことで、ビューとViewModelオブジェクト間のやり取りを自動化することができます。

ViewModelをレイアウトを紐づける方法:

  • レイアウトファイル内にViewModel型のデータバインディング変数を追加します。
   <data>

       <variable
           name="gameViewModel"
           type="com.example.android.guesstheword.screens.game.GameViewModel" />
   </data>
  • GameFragmentファイル内で、GameViewModelをデータバインディングに渡します。
binding.gameViewModel = viewModel

リスナーバインディング

  • リスナーバインディングはonClick()などのクリックイベントが起こされたときに動作するバインディング式です。
  • リスナーバインディングはラムダ式で書かれます。
  • リスナーバインディングを使うことで、UI controllerのクリックリスナーをレイアウトファイルのリスナーバインディングに置き換えることができます。
  • データバインディングはリスナーを生成し、ビュー上のリスナーをセットします。
 android:onClick="@{() -> gameViewModel.onSkip()}"

データバインディングにLiveDataを追加する

  • LiveDataオブジェクトはデータの変化をUIに自動で通知するためのデータバインディングソースとして使うことができます。
  • ビューをViewModelのLiveDataオブジェクトに直接結合することができます。ViewModelのLiveDataが変化すると、レイアウトのビューは自動で更新されます。その際、UI controllerのオブザーバーメソッドは使われません。
android:text="@{gameViewModel.word}"
  • LiveData データバインディングが動作するようにするためには、現在のアクティビティ(UI controller)をUI controller内のbinding変数のライフサイクルオーナーとして設定します。
binding.lifecycleOwner = this

データバインディングを用いたstringフォーマット

  • データバインディングを使うことで、string用の%sやinteger用の%dのようなプレースホルダーを用いてstringリソースをフォーマットすることができます。
  • ビューのtext属性を更新するためには、フォーマットされるstringに引数としてLiveDataオブジェクトを渡します。
 android:text="@{@string/quote_format(gameViewModel.word)}"

お疲れさまでした。次の講座は 5.4 LiveDataの変換です。

おすすめ書籍

Kotlinの文法をまず学びたい!という方には以下の書籍がおすすめです。Kotlinは日本語書籍がまだ豊富とは言えない状況ですが、細かく解説されており、Kotlin入門者のかたでもつまずくことなく学習できると思います。

実際にアプリを作りながら覚えていきたい!という方には以下もお勧めです。はじめに上の書籍で文法をさらっと学んでから取り組むのがお勧めです。

コメント

プロフィール

プロフィール
コードラボJP

大学卒業後SEに就職、現在は退職しフリーランスとして活動中。
『初心者でも挫折せずに一人でプログラミングを学べる』をモットーに、コードラボJPを開設
お問い合わせ等はcodelabsjp@gmail.comまで

コードラボJPをフォローする
タイトルとURLをコピーしました