You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin 切换BottomNavigation到收藏Fragment时如何隐藏ActionBar图标?

实现方案

核心逻辑是将ActionBar菜单的控制权下放到对应Fragment,或者在切换导航时动态控制菜单项可见性,两种常用实现方式如下:

方式1:Fragment独立管理菜单(推荐)

该方案耦合度最低,无需在Activity中处理各页面的菜单逻辑,适配所有BottomNavigation导航场景。

首页Fragment配置

  1. 在首页Fragment的onViewCreated方法中开启菜单注册,声明当前页面需要参与ActionBar菜单构建:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    // 低版本Fragment API使用
    setHasOptionsMenu(true)
}
  1. 重写onCreateOptionsMenu加载首页专属菜单布局:
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
    inflater.inflate(R.menu.menu_home, menu)
    super.onCreateOptionsMenu(menu, inflater)
}
  1. 如需处理菜单项点击,重写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 12:30:05