これからの Fragment#onBackPressed
これからのとは言いますが(2019/09/12)現在のものです。アップデートが入るかもしれませんので...
初めに
ここで紹介するのはFragmentにおける戻るボタンイベントのベストプラクティスです。
環境
| software / library | version |
|---|---|
| AndroidStudio | 3.5 |
| Kotlin | 1.3.50 |
| androidx.appcompat | 1.1.0 |
| androidx.activity | 1.1.0 |
| androidx.fragment | 1.2.0-alpha03 |
実践
androidx.appcompat.app.AppCompatActivityとandroidx.fragment.app.Fragment使ってください。
class FirsFragment: Fragment() {
override fun onAttach(context: Context) {
super.onAttach(context)
requireActivity().onBackPressedDispatcher.addCallback(owner = this, enabled = true) {
// 何か処理
}
}
}
解説
簡単に解説すると、ActivityのBackPressedDispatcherにOnBackPressedCallbackを追加します。
引数のownerはFragmentのLifecyleを監視して自動で開放するためのものです。
enabledは戻るボタンを押したときに他に伝播するかしないかです。
コールバック内で伝播するかしないかを決めたけば、isEnabledを使用すると良いです。
例えば、ViewPagerで最初のページの時だけ今のFragmentを終了するであれば、
addCallback(this) {
// viewModel.isFirstPageでViewPagerが最初のペーかどうか判定する帰り値はBoolean
isEnabled = viewModel.isFirstPage
}
です。
ちなみに、引数enabledはデフォでtrueなので、省略できます。
おわり
前までのFragmentにリスナーを実装してActivivyから呼び出すとか、
ViewにOnKeyListenerをセットしてゴニョゴニョするめんどい実装がなくなっていい感じになりました。