MaterialToolbar图标colorControlNormal不生效问题排查与解决
解决MaterialToolbar自定义图标不继承colorControlNormal着色的问题
我明白你的需求——不想修改SVG文件,也不想在布局里硬加主题属性,只想通过重写toolbarStyle来统一控制所有图标颜色。咱们先理清楚问题出在哪,再给出修复方案。
问题根源
你的自定义SVG图标drawable_favorite里硬编码了android:fillColor="#FF000000",而MaterialToolbar默认只会对没有明确设置fillColor的矢量图标(比如系统自带的溢出图标)应用主题的colorControlNormal着色。对于有固定fillColor的自定义图标,默认不会自动覆盖这个颜色,所以你的配置只影响了溢出图标,没作用到自定义图标上。
修复方案
只需要在你的Widget.GithubUser.Toolbar样式里添加iconTint属性,将它绑定到?attr/colorControlNormal,就能强制让Toolbar的所有图标(包括自定义menu图标)继承主题的颜色,覆盖图标本身的硬编码颜色。
修改后的Toolbar样式代码:
<style name="Widget.GithubUser.Toolbar" parent="Widget.MaterialComponents.Toolbar.Primary"> <!-- 保留你原有的属性 --> <item name="materialThemeOverlay">@style/ThemeOverlay.GithubUser.Toolbar</item> <!-- 添加这一行,强制图标使用colorControlNormal作为着色 --> <item name="iconTint">?attr/colorControlNormal</item> </style>
你的ThemeOverlay.GithubUser.Toolbar配置不需要改动,它已经正确将colorControlNormal指向了?attr/colorOnPrimary,现在通过iconTint把这个颜色绑定到Toolbar的所有图标上,就能实现你想要的效果:所有图标(溢出+自定义)都使用?attr/colorOnPrimary(白色),完全通过主题样式控制,不需要修改SVG或布局文件。
验证逻辑
- 溢出图标:本身没有固定fillColor,会同时受
colorControlNormal和iconTint影响,结果一致; - 自定义图标:
iconTint会覆盖SVG里的硬编码fillColor,强制使用?attr/colorControlNormal对应的颜色; - 完全符合Material Design推荐的通过
toolbarStyle控制样式的最佳实践。
内容的提问来源于stack exchange,提问作者Richard
相关产品推荐
相关产品推荐

