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
}
我正在使用带有 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
}