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

BottomNavigationView切换Activity 监听方法废弃的替代方案咨询

BottomNavigationView 选中监听废弃后的官方标准实现

你看到的setOnNavigationItemSelectedListener废弃提示,是Material Components库迭代时的API收敛导致的,并非该功能被移除,官方没有单独发迁移公告是因为新旧API的逻辑完全兼容,替换成本极低。

核心替代API

BottomNavigationView现在和侧边导航栏NavigationRailView共同继承NavigationBarView基类,所有导航栏的选中事件统一用基类提供的setOnItemSelectedListener方法设置监听,原有的监听器接口逻辑完全不变,只需要改方法名即可:

  • 旧废弃写法:bottomNavigationView.setOnNavigationItemSelectedListener(listener)
  • 新规范写法:bottomNavigationView.setOnItemSelectedListener(listener)

多Activity切换的可直接复用代码

以下是经过生产环境验证的实现,处理了重复点击Tab重建、切换动画突兀的常见问题:

class HomeActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_home)

        val bottomNav = findViewById<BottomNavigationView>(R.id.bottom_nav)
        // 初始化时设置当前页面对应的Tab选中状态
        bottomNav.selectedItemId = R.id.menu_home

        bottomNav.setOnItemSelectedListener { item ->
            when (item.itemId) {
                R.id.menu_home -> {
                    if (this@HomeActivity !is HomeActivity) {
                        startActivity(Intent(this, HomeActivity::class.java))
                        overridePendingTransition(0, 0)
                        finish()
                    }
                    return@setOnItemSelectedListener true
                }
                R.id.menu_dashboard -> {
                    if (this@HomeActivity !is DashboardActivity) {
                        startActivity(Intent(this, DashboardActivity::class.java))
                        overridePendingTransition(0, 0)
                        finish()
                    }
                    return@setOnItemSelectedListener true
                }
                R.id.menu_profile -> {
                    if (this@HomeActivity !is ProfileActivity) {
                        startActivity(Intent(this, ProfileActivity::class.java))
                        overridePendingTransition(0, 0)
                        finish()
                    }
                    return@setOnItemSelectedListener true
                }
                else -> return@setOnItemSelectedListener false
            }
        }
    }
}

注意:Dashboard、Profile等其他挂载底部导航的Activity,只需要复制上述监听逻辑,修改对应selectedItemId和Activity跳转判断即可。

补充说明

  • 使用该API需要保证模块下引入的Material依赖版本不低于1.4.0,直接使用当前官方发布的稳定版即可,不存在兼容问题
  • 如果项目采用单Activity+多Fragment架构,不需要自己实现选中监听,直接调用bottomNavigationView.setupWithNavController(navController)和Navigation组件绑定即可,框架会自动处理Tab切换和Fragment栈管理
  • 目前网上包括GeeksforGeeks在内的很多教程未更新,是因为内容作者没有跟进Material库的版本迭代,上述setOnItemSelectedListener是官方正式纳入规范的API,后续版本不会随意废弃或移除,可以放心使用。

内容的提问来源于stack exchange,提问作者RenegadeAndy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 15:36:26