#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
}