如何在保留Navigation对MaterialToolbar支持的前提下实现标题居中
核心遵循原则:全程不替换Toolbar的内部原生控件,不改动Navigation对Toolbar的原有绑定逻辑,完整保留目的地自动更新标题、自动切换返回导航按钮的现有能力
为什么之前的修改尝试不生效
- 单纯靠修改Toolbar全局样式设置文字对齐不生效,是因为Navigation在执行
setupWithNavController绑定时,会直接调整Toolbar内部mTitleTextView的布局参数,把标题的左偏移量对齐到左侧导航按钮、右侧菜单的预留空间,代码层设置的布局参数优先级远高于主题样式,写在xml里的textAlignment配置根本不会被应用。 - 在Toolbar内部额外放自定义TextView当标题的方案完全行不通:Toolbar内置的标题控件会一直占位显示,出现两个标题重叠的问题;且Navigation更新标题时只会修改内置控件的内容,自定义TextView不会随目的地同步切换,本质上是破坏了原有绑定的链路。
无侵入实现步骤
1. 高版本Material库直接使用原生属性(推荐)
如果项目使用的com.google.android.material:material依赖版本≥1.4.0,直接在MaterialToolbar的布局节点加一行属性即可,完全不需要写额外代码:
<com.google.android.material.appbar.MaterialToolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" app:titleCentered="true" <!-- 原有其他配置保留不动 --> app:menu="@menu/main_menu" app:navigationIcon="@drawable/ic_back"/>
这个titleCentered是MaterialToolbar内置的原生支持属性,开启后会自动让内置标题控件以整个Toolbar的宽度为基准居中对齐,不受左右两侧按钮的空间偏移影响,和Navigation的绑定逻辑完全兼容。
2. 低版本Material库的兼容实现
如果依赖版本低于1.4.0没有上述属性,不需要修改原有绑定代码,只需要在完成setupWithNavController绑定之后,追加几行布局参数调整逻辑即可:
// 原有Navigation绑定逻辑完全保留 val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment val navController = navHostFragment.navController toolbar.setupWithNavController(navController) // 仅调整内置标题控件的对齐规则,不修改控件引用本身 toolbar.childSequence .filterIsInstance<TextView>() .firstOrNull { it.text == toolbar.title } ?.let { titleView -> val layoutParams = titleView.layoutParams as Toolbar.LayoutParams // 清除原有随导航按钮偏移的边距,设置居中对齐 layoutParams.gravity = Gravity.CENTER layoutParams.marginStart = 0 layoutParams.marginEnd = 0 titleView.layoutParams = layoutParams }
这部分调整完全不会干扰Navigation的原有控制逻辑:Navigation依然会在Fragment切换时自动写入对应的页面标题,依然会根据回退栈状态自动切换左侧导航图标的交互与样式,因为我们从头到尾没有替换、移除Toolbar内部的任何原生控件,只是改了标题控件的布局对齐规则。
踩坑注意事项
- 不要给Toolbar添加左右方向的padding来凑居中效果,会连带把导航按钮、菜单按钮一起挤歪,破坏原有交互布局。
- 标题的字号、颜色等样式调整,依然可以通过
app:titleTextAppearance属性配置,和居中设置完全兼容,没有冲突。 - 不要试图通过主题配置覆盖标题对齐属性,代码层的布局参数优先级远高于主题配置,配置了也不会生效。
内容的提问来源于stack exchange,提问作者Mehdi Jahed Manesh
相关产品推荐
相关产品推荐

