Android Kotlin基礎講座 05.2: LiveDataとLiveData observers

タスク:Play Againボタンを追加する

このタスクでは、得点画面にPlay Againボタンを追加し、LiveDataイベントを使ったクリックリスナーを実装します。ボタンによって得点画面からゲーム画面に遷移するためのイベントが引き起こされます。

このアプリのスターターコードにはPlay Againボタンが含まれています。しかしボタンは現在非表示になっています。

  1. res/layout/score_fragment.xml内のplay_again_buttonのvisibility属性の値をvisibleに変更してください。
<Button
   android:id="@+id/play_again_button"
...
   android:visibility="visible"
 />
  1. ScoreViewModel内に_eventPlayAgainというBoolean型の変数を保持するためのLiveDataオブジェクトを追加してください。このオブジェクトは得点画面からゲーム画面に遷移するためのLiveDataイベントを保存するために使われます。
private val _eventPlayAgain = MutableLiveData<Boolean>()
val eventPlayAgain: LiveData<Boolean>
   get() = _eventPlayAgain
  1. ScoreViewModel内で、_eventPlayAgainイベントをセット、リセットするためのメソッドを定義してください。
fun onPlayAgain() {
   _eventPlayAgain.value = true
}
fun onPlayAgainComplete() {
   _eventPlayAgain.value = false
}
  1. ScoreFragment内に、eventPlayAgain用のオブザーバーを追加してください。onCreateView()内のreturn文の直前にコードを追加します。ラムダ式の中でゲーム画面に遷移させ、eventPlayAgainをリセットしています。
// Navigates back to game when button is pressed
viewModel.eventPlayAgain.observe(viewLifecycleOwner, Observer { playAgain ->
   if (playAgain) {
      findNavController().navigate(ScoreFragmentDirections.actionRestart())
       viewModel.onPlayAgainComplete()
   }
})

Android Studioに促された場合は、androidx.navigation.fragment.findNavControllerをインポートしてください。

  1. ScoreFragmentのonCreateView()の中にPlay Againボタン用のクリックリスナーを追加し、viewModel.onPlayAgain()を呼び出してください。
binding.playAgainButton.setOnClickListener {  viewModel.onPlayAgain()  }
  1. アプリを起動しゲームをプレイしてください。ゲームが終了した際、得点画面に得点とPlay Againボタンが表示されます。Play Againボタンをタップしmアプリがゲーム画面に遷移し、再びゲームがプレイできるようになっていることを確認してください。

完成済みプロジェクト

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

GuessTheWord