Posted at

これからの Fragment#onBackPressed(Backボタンイベント)


 これからの 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.AppCompatActivityandroidx.fragment.app.Fragment使ってください。


FirstFragment.kt

class FirsFragment: Fragment() {

override fun onAttach(context: Context) {
super.onAttach(context)
requireActivity().onBackPressedDispatcher.addCallback(owner = this, enabled = true) {
// 何か処理
}
}
}


解説

簡単に解説すると、ActivityBackPressedDispatcherOnBackPressedCallbackを追加します。

引数のownerはFragmentのLifecyleを監視して自動で開放するためのものです。

enabledは戻るボタンを押したときに他に伝播するかしないかです。

コールバック内で伝播するかしないかを決めたけば、isEnabledを使用すると良いです。

例えば、ViewPagerで最初のページの時だけ今のFragmentを終了するであれば、


FirstFragment.kt#addCallback

addCallback(this) {

// viewModel.isFirstPageでViewPagerが最初のペーかどうか判定する帰り値はBoolean
isEnabled = viewModel.isFirstPage
}

です。

ちなみに、引数enabledはデフォでtrueなので、省略できます。


おわり

前までのFragmentにリスナーを実装してActivivyから呼び出すとか、

ViewOnKeyListenerをセットしてゴニョゴニョするめんどい実装がなくなっていい感じになりました。