Kotlin 切换BottomNavigation到收藏Fragment时如何隐藏ActionBar图标?
实现方案
核心逻辑是将ActionBar菜单的控制权下放到对应Fragment,或者在切换导航时动态控制菜单项可见性,两种常用实现方式如下:
方式1:Fragment独立管理菜单(推荐)
该方案耦合度最低,无需在Activity中处理各页面的菜单逻辑,适配所有BottomNavigation导航场景。
首页Fragment配置
- 在首页Fragment的
onViewCreated方法中开启菜单注册,声明当前页面需要参与ActionBar菜单构建:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // 低版本Fragment API使用 setHasOptionsMenu(true) }
- 重写
onCreateOptionsMenu加载首页专属菜单布局:
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { inflater.inflate(R.menu.menu_home, menu) super.onCreateOptionsMenu(menu, inflater) }
- 如需处理菜单项点击,重写
onOptionsItemSelected即可。
收藏Fragment配置
不需要做任何菜单相关配置,也不要调用setHasOptionsMenu(true)。当通过BottomNavigation切换到收藏Fragment时,系统会自动销毁首页Fragment注册的菜单,ActionBar上的图标会自动隐藏。
如果是手动管理Fragment切换的场景,切换完成后调用以下代码触发菜单刷新即可:
requireActivity().invalidateOptionsMenu()
方式2:Activity全局控制菜单可见性
如果菜单是在Activity层面全局配置的,可以监听BottomNavigation选中事件动态控制菜单项显示隐藏:
bottomNavigationView.setOnItemSelectedListener { item -> val homeMenu1 = supportActionBar?.menu?.findItem(R.id.menu_search) val homeMenu2 = supportActionBar?.menu?.findItem(R.id.menu_setting) when(item.itemId) { R.id.nav_home -> { homeMenu1?.isVisible = true homeMenu2?.isVisible = true // 切换到首页Fragment逻辑 } R.id.nav_favorite -> { homeMenu1?.isVisible = false homeMenu2?.isVisible = false // 切换到收藏Fragment逻辑 } } true }
AndroidX Fragment 1.4.0+ 适配说明
setHasOptionsMenu相关API在高版本Fragment中已废弃,推荐使用MenuProvider实现菜单管理,首页Fragment示例代码如下:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) val menuHost = requireActivity() as MenuHost menuHost.addMenuProvider( object : MenuProvider { override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) { menuInflater.inflate(R.menu.menu_home, menu) } override fun onMenuItemSelected(menuItem: MenuItem): Boolean { return when (menuItem.itemId) { R.id.menu_search -> { // 处理搜索点击逻辑 true } else -> false } } }, viewLifecycleOwner, Lifecycle.State.RESUMED ) }
收藏Fragment不需要添加任何MenuProvider,切换到该页面时首页的菜单会跟随生命周期自动注销隐藏。
内容的提问来源于stack exchange,提问作者Amando Arkan
相关产品推荐
相关产品推荐

