LoginSignup
19
12

More than 1 year has passed since last update.

FragmentでOnBackPressedを拾う

Last updated at Posted at 2019-03-03

はじめに

:warning: この記事の内容は古いです:warning:
今はおとなしくOnBackPressedDispatcherを使うのが良いと思います。

↓↓↓以下古い記載↓↓↓

Activityと同じ感覚でFragmentのバックキー押下イベントを検知しようとして詰まって調べたのでメモを残しておきます。
あまり関係ないですがAndroidX対応済のプロジェクトです。

  • androidx.appcompat.app.AppCompatActivity
  • androidx.fragment.app.Fragment

実装

まずはリスナーを作ります。

OnBackPressedListener.kt
interface OnBackPressedListener {

    fun onBackPressed()
}

Fragment側でimplementします。

BackPressableFragment.kt
class BackPressableFragment: Fragment(), OnBackPressedListener {

    override fun onBackPressed() {
        // ここで任意の処理を行う
    }

}

※最初にActivityに対してFragmentをadd, replaceした際にtagとして FragmentのsimpleName を指定しているものとします。
ActivityのonBackPRessed内にて、fragmentに実装したOnBackPressedListenerのメソッドを呼び出すことによって、端末のバックキー押下時にFragment内に定義したメソッドが実行できます。

MainActivity.kt
    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が終了されます、参考までに。

BackPressableFragment.kt

class BackPressableFragment: Fragment(), OnBackPressedListener {

    override fun onBackPressed() {
        // ここで任意の処理を行う

        //Activityの終了を呼び出す
        requireActivity().finish()
    }

}
19
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
12