はじめに
この記事の内容は古いです
今はおとなしくOnBackPressedDispatcher
を使うのが良いと思います。
↓↓↓以下古い記載↓↓↓
Activityと同じ感覚でFragmentのバックキー押下イベントを検知しようとして詰まって調べたのでメモを残しておきます。
あまり関係ないですがAndroidX対応済のプロジェクトです。
- androidx.appcompat.app.AppCompatActivity
- androidx.fragment.app.Fragment
実装
まずはリスナーを作ります。
interface OnBackPressedListener {
fun onBackPressed()
}
Fragment側でimplementします。
class BackPressableFragment: Fragment(), OnBackPressedListener {
override fun onBackPressed() {
// ここで任意の処理を行う
}
}
※最初にActivityに対してFragmentをadd, replaceした際にtagとして FragmentのsimpleName を指定しているものとします。
ActivityのonBackPRessed内にて、fragmentに実装したOnBackPressedListenerのメソッドを呼び出すことによって、端末のバックキー押下時にFragment内に定義したメソッドが実行できます。
override fun onBackPressed() {
val found = supportFragmentManager.findFragmentByTag(BackPressableFragment::class.java.simpleName)
if (found != null && found is BackPressableFragment) {
(found as OnBackPressedListener).onBackPressed()
} else {
super.onBackPressed()
}
}
おわりに
Fragment側のメソッドが実行される分岐に入ると Activity#onBackPressed
においてsuper.onBackPressed()
が実行されなくなります。
解決方法はいくつもあると思いますが期待している挙動がActivityの終了である場合にはFragment側のonBackPressedで以下のように書けばActivityが終了されます、参考までに。
class BackPressableFragment: Fragment(), OnBackPressedListener {
override fun onBackPressed() {
// ここで任意の処理を行う
//Activityの終了を呼び出す
requireActivity().finish()
}
}