如何根据底部导航点击的图标同步修改ActionBar标题
嘿,这个需求很容易搞定,我分两种常见的实现场景给你讲:
一、传统方式(直接监听BottomNavigationView选中事件)
如果你的项目没用到Jetpack Navigation组件,直接给BottomNavigationView设置选中监听器就行:
- 首先在你的Activity里获取BottomNavigationView实例:
// Kotlin示例 val bottomNav = findViewById<BottomNavigationView>(R.id.bottom_navigation)
// Java示例 BottomNavigationView bottomNav = findViewById(R.id.bottom_navigation);
- 给它设置
OnNavigationItemSelectedListener,在选中事件里根据点击的item切换标题:
bottomNav.setOnNavigationItemSelectedListener { item -> when(item.itemId) { R.id.nav_home -> { supportActionBar?.title = "首页" true } R.id.nav_dashboard -> { supportActionBar?.title = "仪表盘" true } R.id.nav_notifications -> { supportActionBar?.title = "通知" true } else -> false } }
bottomNav.setOnNavigationItemSelectedListener(item -> { switch (item.getItemId()) { case R.id.nav_home: if (getSupportActionBar() != null) { getSupportActionBar().setTitle("首页"); } return true; case R.id.nav_dashboard: if (getSupportActionBar() != null) { getSupportActionBar().setTitle("仪表盘"); } return true; case R.id.nav_notifications: if (getSupportActionBar() != null) { getSupportActionBar().setTitle("通知"); } return true; default: return false; } });
注意:如果你用的是自定义Toolbar,记得先在onCreate里调用
setSupportActionBar(toolbar),这样supportActionBar才会指向你的自定义Toolbar。
二、使用Jetpack Navigation Component的情况
如果你的项目用了Navigation组件来管理页面跳转,更优雅的方式是监听导航目的地的变化,自动切换标题:
- 获取NavController实例,然后添加
OnDestinationChangedListener:
// Kotlin示例 val navController = findNavController(R.id.nav_host_fragment) navController.addOnDestinationChangedListener { _, destination, _ -> supportActionBar?.title = when(destination.id) { R.id.homeFragment -> "首页" R.id.dashboardFragment -> "仪表盘" R.id.notificationsFragment -> "通知" else -> "默认标题" } }
// Java示例 NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment); navController.addOnDestinationChangedListener((controller, destination, arguments) -> { if (getSupportActionBar() != null) { switch (destination.getId()) { case R.id.homeFragment: getSupportActionBar().setTitle("首页"); break; case R.id.dashboardFragment: getSupportActionBar().setTitle("仪表盘"); break; case R.id.notificationsFragment: getSupportActionBar().setTitle("通知"); break; default: getSupportActionBar().setTitle("默认标题"); } } });
这种方式的好处是,不管是通过底部导航点击,还是其他方式跳转页面,标题都会自动同步,不用在每个Fragment里单独设置标题。
另外,推荐把标题字符串放到strings.xml里,方便多语言适配,比如用getString(R.string.home_title)来代替硬编码的文字。
内容的提问来源于stack exchange,提问作者Ritesh Geddam
相关产品推荐
相关产品推荐

