Kotlin开发中如何移除Toolbar工具栏标题?Navigation场景常规设置无效
问题说明
- 我有如下所示的Toolbar:

- 需求:移除Fragment关联的Toolbar标题,以便展示更多菜单项。
- 疑问:该设置应该在XML文件中配置,还是在Activity中实现?
此前尝试的无效操作
我在MainActivity中添加了如下代码,均未生效:
getActionBar().setDisplayShowTitleEnabled(false); getSupportActionBar().setDisplayShowTitleEnabled(false); setSupportActionBar(toolbar).setTitle(""); toolbar.setTitle(null)
附带的MainActivity代码片段
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) setSupportActionBar(toolbar) val navController = Navigation.findNavController(this, R.id.nav_host_fragment) setupBottomNavMenu(navController) setupSideNavigationMenu(navController) setupActionBar(navController) } }
无效原因分析
你之前的操作不生效主要有四个核心原因:
- API调用错误:
getActionBar()是原生ActionBar的方法,在AppCompatActivity下默认返回null,该行代码执行后无实际效果。 - 代码写法错误:
setSupportActionBar(toolbar).setTitle("")中setSupportActionBar是无返回值的方法,该行代码实际不会执行设置标题的逻辑。 - 逻辑被覆盖:
setupActionBar(navController)一般内部是调用setupActionBarWithNavController,该方法会让NavController自动同步导航图(nav_graph)中各Fragment目的地的android:label属性到Toolbar标题,你手动设置的隐藏/清空标题的逻辑,会在目的地切换时被自动回调覆盖。 - 操作对象错误:直接调用
toolbar.setTitle(null)无法生效,因为Toolbar已经作为SupportActionBar被接管,标题展示控制权在SupportActionBar手中,直接修改Toolbar属性会被ActionBar的同步逻辑覆盖。
可行解决方案
两种配置方式都可实现,根据不同的需求场景选择对应方案即可:
场景1:全局所有页面都隐藏Toolbar标题
直接在setSupportActionBar(toolbar)之后调用SupportActionBar的显示开关即可,该开关不会被NavController的标题同步逻辑覆盖:
setSupportActionBar(toolbar) // 关闭标题显示,全局所有页面都不会展示标题 supportActionBar?.setDisplayShowTitleEnabled(false)
后续正常执行NavController绑定逻辑即可。如果需要XML配置配合,可直接在Toolbar的布局XML中添加app:title="",避免默认标题残留。
场景2:仅部分页面隐藏标题,其他页面保留标题
给NavController添加目的地切换监听器,根据页面动态控制标题显示:
// 在setupActionBar(navController)之后添加即可 navController.addOnDestinationChangedListener { _, destination, _ -> // 替换为需要隐藏标题的页面id if (destination.id == R.id.nav_home || destination.id == R.id.nav_profile) { supportActionBar?.setDisplayShowTitleEnabled(false) } else { // 其他页面恢复显示标题 supportActionBar?.setDisplayShowTitleEnabled(true) } }
场景3:仅清空标题文字、保留标题占位空间
直接修改导航图(nav_graph.xml)中对应Fragment的android:label属性为"",NavController自动同步时就会把标题设为空,不需要额外写代码。
内容的提问来源于stack exchange,提问作者Enigma
相关产品推荐
相关产品推荐

