【Kotlin/Android Studio】デバイスのバックボタン押下時イベント取得方法!onBackPressedDispatcher

この記事からわかること
- Android Studio/Kotlinでデバイスのバックボタン(戻るボタン)を押下したイベントを取得するには?
- onBackPressedメソッドの使い方
- onBackPressedDispatcherの使い方
index
[open]
\ アプリをリリースしました /
環境
- Android Studio:Meerkat
- Kotlin:2.0.21
- Android:16
デバイスのバックボタン押下時イベント:onBackPressed
Kotlinでデバイスに用意されているバックボタンを押下された時に任意の処理を実行したい場合はonBackPressed
をオーバーライドしてその中に処理を記述します。Activityにこれを実装するとFragmentに画面を切り替えてもこの処理は生きているのでFragmentが表示される状態でバックボタンを押すとこの場合トーストが表示されます。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
override fun onBackPressed() {
Toast.makeText(this,"バックボタンが押されたよ",Toast.LENGTH_LONG).show()
}
}
元々のバックボタンの処理(戻る処理)自体を残しておきたい場合はsuper.onBackPressed()
を実行します。
override fun onBackPressed() {
Toast.makeText(this,"バックボタンが押されたよ",Toast.LENGTH_LONG).show()
super.onBackPressed()
}
Fragmentに実装したい場合:onBackPressedDispatcher
Fragmentに実装したい場合はonBackPressed
メソッドをオーバーライドできないのでonBackPressedDispatcher
を使用します。addCallback
の引数には以下の値を渡します。
・owner
・・・ライフサイクル監視対象
・onBackPressedCallback
・・・バックボタン押下時に処理したいコールバック
class FirstFragment : Fragment() {
// onCreateView(省略)
override fun onAttach(context: Context) {
super.onAttach(context)
requireActivity().onBackPressedDispatcher.addCallback(this, onBackPressedCallback)
}
private val onBackPressedCallback = object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
Toast.makeText(context,"バックボタンが押されたよ",Toast.LENGTH_LONG).show()
}
}
}
OnBackPressedCallback
型の引数のenabled
にはこのコールバック処理の有効/無効のフラグを渡します。上記のように最初に引数として指定した後でもコードから以下のように動的に値を変化させることも可能です。
onBackPressedCallback.isEnabled = true
アプリTOP画面まで戻ってしまうバグ
特定の端末でシステムのバックボタン(戻る)をタップした際にアプリTOPまで戻ってしまうバグがありました。TOP>画面A>画面Bと遷移して画面Bで戻る操作をした時に画面Aに戻らなかった感じです。
公式リファレンス:予測型「戻る」ジェスチャーをオプトインする
調査してみると原因はよくわかりませんが「予測型「戻る」ジェスチャー」の設定を明示的にfalse
にしたところ問題なく動作するようになりました。
<application
...
android:enableOnBackInvokedCallback="false"
... >
...
</application>
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。