Android 导航组件 - 设置 HasOptionsMenu 会使 NavigateUp 按钮无效

Android Navigation Component - Setting HasOptionsMenu invalidates NavigateUp button

我正在使用带有 bottomNavigationView 的 Android 导航组件。我已经在我的 MainActivity 中配置了 AppBar,这样当应用程序不在图表的起始目的地时,就会出现向上导航按钮。

我已经设置 SupportedActionBar 并像这样覆盖 onSupportNavigateUp

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = ActivityMainBinding.inflate(layoutInflater)
    setContentView(binding.root)
    setSupportActionBar(binding.mainToolbar)

    ...

    val controller = binding.bottomNavView.setupWithNavController(
        navGraphIds = navGraphIds,
        fragmentManager = supportFragmentManager,
        containerId = R.id.nav_host_container,
        intent = intent
    )

    controller.observe(this, Observer { navController ->
        appBarConfiguration = AppBarConfiguration(
            topLevelDestinationIds = setOf(
                navController.graph.startDestination,
                R.id.navigation_level_up_onboarding
            )
        )

        setupActionBarWithNavController(navController, appBarConfiguration)
    })
    currentController = controller
}

override fun onSupportNavigateUp(): Boolean {
    return currentController?.value?.navigateUp() ?: false
}

在导航图中,我有一个目的地 ProfileSettingsFragment,它需要有菜单选项。我是这样设置的:

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

    ....
}

override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
    inflater.inflate(R.menu.profile_settings_menu, menu)
    super.onCreateOptionsMenu(menu, inflater)
}

菜单选项工作正常,但是,当我调用 setHasOptionsMenu(true) 时,navigateUp 按钮停止对该片段起作用。

我做错了什么?在使用导航组件时保持 navigateUp 行为的同时在片段上添加菜单选项的正确方法是什么?

因为您使用的是 Toolbar 而不是

setupActionBarWithNavController(navController, appBarConfiguration)

你可以使用

toolbar.setupWithNavController(navController, appBarConfiguration)

并且您不需要重写 onSupportNavigateUp() 方法。

这对我来说很好用。在 onOptionsItemSelected() 中使用 actionbar 时添加此检查是否为向上按钮 clicked/pressed.

在科特林中:

override fun onOptionsItemSelected(item: MenuItem): Boolean {
        when (item.itemId) {
            android.R.id.home->
                requireActivity().onBackPressed() 
          ....//rest of your code
    }

在 java 期间:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case android.R.id.home :
            getActivity().onBackPressed();
            break;
        ....//rest of your code
}