LoginSignup
5
1

More than 1 year has passed since last update.

Navigation+ToolbarでOptionsMenuを出すにはsetSupportActionBarの位置に気をつける

Last updated at Posted at 2019-10-13

概要

JetpackのNavigationの話です。
https://developer.android.com/guide/navigation

タイトルどおりですが、NavigationでToolbarを使ってOptionsMenuを出すときにちょっとしたことでつまずいたので残しておきます。

Navigationのバージョンは以下です。

implementation 'androidx.navigation:navigation-fragment-ktx:2.1.0'
implementation 'androidx.navigation:navigation-ui-ktx:2.1.0'

構成

MainActivityにToolbarがあります。

表示する画面はFragmentで作っており、2つの画面があります。
1つめのFragmentのToolbarには、タイトルだけ表示されています。
2つめのFragmentのToolbarには、1つめのFragmentに戻るnavigationIconとOptionsMenuがあります。

ToolbarのセットアップはActivityで、OptionsMenuのセットアップは2つめのFragmentで行っています。

1つめのFragment
2つめのFragment

Toolbarのセットアップ

MainActivity.kt

class MainActivity : AppCompatActivity() {

    lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
        setupToolbar()
    }

    private fun setupToolbar() {
        val navController = findNavController(R.id.nav_host_fragment)
        val toolbar = binding.toolbar

        // (1) OptionsMenuを出すために必要
        setSupportActionBar(toolbar)
        // (2) タイトル設定、Up navigateボタンのために必要
        toolbar.setupWithNavController(navController)
        // (2)はこちらの書き方でもOK
        // NavigationUI.setupWithNavController(toolbar, navController)
    }
}

上記のようにActivityでToolbarの設定を行うと、期待通りの挙動になります。

OptionsMenuが出ない


private fun setupToolbar() {
        val navController = findNavController(R.id.nav_host_fragment)
        val toolbar = binding.toolbar

        // (2) タイトル設定、Up navigateボタンのために必要
        toolbar.setupWithNavController(navController)
        // (2)はこちらの書き方でもOK
        // NavigationUI.setupWithNavController(toolbar, navController)
    }

setSupportActionBar(toolbar)を呼ばないと、OptionsMenuが出ません。

Up navigateボタンが効かない


private fun setupToolbar() {
        val navController = findNavController(R.id.nav_host_fragment)
        val toolbar = binding.toolbar

        // (2) タイトル設定、Up navigateボタンのために必要
        toolbar.setupWithNavController(navController)
        // (2)はこちらの書き方でもOK
        // NavigationUI.setupWithNavController(toolbar, navController)

        // (1) OptionsMenuを出すために必要
        setSupportActionBar(toolbar)
    }

このように、setupWithNavControllerの後に、setSupportActionBar(toolbar)してしまうと、Upボタンは表示されているのに効きません。

なお、Toolbarを使用する場合は、Navigationがナビゲーションボタンのイベントを自動で処理してくれるため、onSupportNavigateUp()をオーバーライドする必要はありません。

サンプルコード

下記にコードがあります。
https://github.com/iiinaiii/UI-Samples/blob/master/app/src/main/java/com/iiinaiii/uisamples/ui/MainActivity.kt

5
1
1

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
5
1