BottomNavigationView切换Activity 监听方法废弃的替代方案咨询
你看到的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
相关产品推荐
相关产品推荐

