Навигационный компонент Android — настройка HasOptionsMenu делает недействительной кнопку навигации

#android #kotlin #android-architecture-navigation #android-jetpack-navigation #navigation-architecture

#Android #kotlin #android-архитектура-навигация #android-jetpack-навигация #навигация-архитектура

Вопрос:

Я использую навигационный компонент Android с bottomNavigationView . Я настроил панель приложений в моем MainActivity так, чтобы кнопка перехода вверх появлялась, когда приложение не находится в начальной точке графика.

Я установил 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 при использовании навигационного компонента?

Ответ №1:

Поскольку вы используете Toolbar вместо

 setupActionBarWithNavController(navController, appBarConfiguration)
  

вы можете использовать

 toolbar.setupWithNavController(navController, appBarConfiguration)
  

и вам не нужно переопределять onSupportNavigateUp() метод.

Ответ №2:

У меня это работает нормально. При использовании actionbar в onOptionsItemSelected() добавьте эту проверку для нажатия кнопки up.

В kotlin:

 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
}