はじめに
この記事はand factory.inc Advent Calendar 2023 24日目の記事です。
昨日は @arusu0629 さんの「スクラムマスターに俺はなる!」でした。
特定のタイミングでバックボタンの操作を無効にする方法について記載します
やりたいこと
- ViewPagerのような親Fragmentと子Fragmentを使っていて、親Fragmentで既に、OnBackPressedDispatcher を使ってバックボタンの操作をカスタマイズしている
- 子Fragmentでアニメーションなどを再生中はバックボタンの操作を無効にしたい
- アニメーション再生中以外は親Fragmentでバックボタンのイベントを受け取リたい
実装
子Fragment.kt
private val backPressedCallback by lazy {
// OnBackPressedCallback(true)にすると
// 親Fragmentでバックボタンのイベントが受け取れなくなるため false を指定する
object : OnBackPressedCallback(false) {
override fun handleOnBackPressed() {
// バックボタンの操作を無効化したいので何もしない
}
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner, backPressedCallback)
}
private fun startAnimation(){
// バックボタンの操作を受け取るようにする
backPressedCallback.isEnabled = true
}
private fun finishAnimation(){
// バックボタンのイベントを受け取らないようにする。親のFragmentで受け取るようにする
backPressedCallback.isEnabled = false
}
おわりに
- イベントを受け取らないように OnBackPressedCallback を生成するとうまく動きました
- 他にも良いやり方がありましたら教えてください