Android Kotlin基礎講座 05.4: LiveDataの変換

タスク:LiveDataを変換する

Transformations.map()メソッドはソースとなるLiveDataのデータを操作する手段で、操作結果のLiveDataオブジェクトを返します。これらの変換はオブザーバーが返されるLiveDataオブジェクトを監視していない限り、計算処理されません。

このメソッドはソースとなるLiveDataと関数をパラメーターにとります。関数はソースのLiveDataを操作します。

Note: Transformation.map()に渡されるラムダ式はメインスレッドで実行されるので、時間のかかるタスクは含まれるべきではありません。

このタスクでは、経過時間のLiveDataオブジェクトをstring型のLiveDataオブジェクトに”MM:SS”フォーマットにします。またフォーマットされた経過時間は画面に表示されるようにします。

game_fragment.xmlレイアウトファイルは既にタイマーテキストビューを含んでいます。ここまでは、テキストビューには表示するテキストが入っていなかったので、タイマーは表示されていませんでした。

  1. GameViewModellクラスのcurrentTimeの初期化文の後に、currentTimeStringという名前の新しいLiveDataオブジェクトを作成してください。このオブジェクトはcurrentTimeのフォーマットされたstringバージョン用です。
  2. currentTimeStringを定義するために、Transformations.map()を利用してください。currentTimeと、時間をフォーマットするためのラムダ関数を渡してください。DateUtils.formatElapsedTime()ユーティリティメソッドを使ってラムダ関数を実装することができます。これはミリ秒単位のlong型の数値を取り、”MM:SS”という形のstringフォーマットに変換してくれます。
// The String version of the current time
val currentTimeString = Transformations.map(currentTime) { time ->
   DateUtils.formatElapsedTime(time)
}
  1. game_fragment.xmlファイルのタイマーテキストビューの中で、text属性をgameViewModelのcurrentTimeStringと結び付けてください。
<TextView
   android:id="@+id/timer_text"
   ...
   android:text="@{gameViewModel.currentTimeString}"
   ... />
  1. アプリを起動し、ゲームをプレイしてください。タイマーテキストが毎秒更新されます。全ての単語を巡回してもゲームが終了しないことを確認してください。ゲームはタイマーが終了したときに終了します。

完成済みプロジェクト

お疲れさまでした。ゲームを自動で終了させるタイマーをアプリに追加することができました。またLiveDataオブジェクトを別の型に変換するためのTransformations.map()の使い方も学習しました。

完成済みプロジェクトは以下からダウンロードできます。

GuessTheWord