Android Kotlin基礎講座 05.2: LiveDataとLiveData observers
目次
タスク:Play Againボタンを追加する
このタスクでは、得点画面にPlay Againボタンを追加し、LiveDataイベントを使ったクリックリスナーを実装します。ボタンによって得点画面からゲーム画面に遷移するためのイベントが引き起こされます。
このアプリのスターターコードにはPlay Againボタンが含まれています。しかしボタンは現在非表示になっています。
- res/layout/score_fragment.xml内のplay_again_buttonのvisibility属性の値をvisibleに変更してください。
<Button
android:id="@+id/play_again_button"
...
android:visibility="visible"
/>
- ScoreViewModel内に_eventPlayAgainというBoolean型の変数を保持するためのLiveDataオブジェクトを追加してください。このオブジェクトは得点画面からゲーム画面に遷移するためのLiveDataイベントを保存するために使われます。
private val _eventPlayAgain = MutableLiveData<Boolean>()
val eventPlayAgain: LiveData<Boolean>
get() = _eventPlayAgain
- ScoreViewModel内で、_eventPlayAgainイベントをセット、リセットするためのメソッドを定義してください。
fun onPlayAgain() {
_eventPlayAgain.value = true
}
fun onPlayAgainComplete() {
_eventPlayAgain.value = false
}
- 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をインポートしてください。
- ScoreFragmentのonCreateView()の中にPlay Againボタン用のクリックリスナーを追加し、viewModel.onPlayAgain()を呼び出してください。
binding.playAgainButton.setOnClickListener { viewModel.onPlayAgain() }
- アプリを起動しゲームをプレイしてください。ゲームが終了した際、得点画面に得点とPlay Againボタンが表示されます。Play Againボタンをタップしmアプリがゲーム画面に遷移し、再びゲームがプレイできるようになっていることを確認してください。
完成済みプロジェクト
完成済みプロジェクトは以下からダウンロードできます。