目的

Androidアプリのアプリバー(アクションバー)に戻るボタンを表示させて、前の画面に戻る処理のメモ
Fragmentの時を想定。

環境

  • Android Studio 4.1.1
  • Kotlin 1.4.32

参照サイト

Qiita FragmentでActionBarを指定したい!
Fragmentだと設定を1つ追加する必要があり、上記サイトを参照に設定した。

対応メモ

遷移元のFragmentは以下としました。
遷移から戻ってきた時に戻るボタンが表示されたままなので、ボタンを表示にする設定をしています。

遷移元画面での戻るボタン非表示
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        // fragmentでアクションバー共有している場合は必要。activityだと不要な時もあり
        (activity as AppCompatActivity).supportActionBar?.setDisplayHomeAsUpEnabled(false)
        (activity as AppCompatActivity).supportActionBar?.setHomeButtonEnabled(false)

        ....
    }

遷移先のFragmentは以下としました。

遷移先画面での戻るボタン処理
import android.view.MenuItem
....


    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        // アクションバー戻るボタン表示
        (activity as AppCompatActivity).supportActionBar?.setDisplayHomeAsUpEnabled(true)
        (activity as AppCompatActivity).supportActionBar?.setHomeButtonEnabled(true)

        // Fragmentの場合はこの設定を行わないと、戻るボタンを押しても挙動しない。
        // activityでは不要と考える
        setHasOptionsMenu(true)

        ...

    }

    ...

    // 戻るボタンタップ時の挙動
    // findNavController().navigate(R.id.action_SecondFragment_to_FirstFragment)はアプリテンプレの処理をそのまま流用
    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        val id = item.itemId
        var result = false
        if (id == android.R.id.home) {
            findNavController().navigate(R.id.action_SecondFragment_to_FirstFragment)
        } else {
            result = super.onOptionsItemSelected(item)
        }
        return result
    }

実際の挙動

動きとしては以下です。