Android中如何修改Material Design 3的PopupMenu图标颜色
失效原因
- Material 3 组件库中,非Toolbar挂载的PopupMenu菜单项图标,默认不读取
colorControlNormal属性,该属性仅对旧版Material组件、Toolbar溢出菜单场景生效 - 直接在
Widget.Material3.PopupMenu样式节点下配置的颜色属性,默认不会透传给内部的MenuItem子布局,因此配置无效 - 普通View触发的PopupMenu不会复用Toolbar的菜单主题配置,因此公开渠道针对Toolbar场景的解决方案不适用。
生效方案
方案1:全局统一配置
如果全应用所有PopupMenu图标需要统一色值,直接在应用根主题配置MD3菜单图标默认读取的色值属性即可:
<style name="Theme.MyApp" parent="Theme.Material3.DayNight.NoActionBar"> <!-- 原有配置保持不变 --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorBackground</item> <item name="android:navigationBarColor">@color/colorWhite</item> <item name="android:windowBackground">@color/colorBackground</item> <item name="popupMenuStyle">@style/Widget.App.PopupMenu</item> <!-- 新增配置:MD3 PopupMenu图标默认取该属性色值 --> <item name="colorOnSurfaceVariant">@color/colorSecondary</item> </style>
提示:
colorOnSurfaceVariant是MD3通用语义色,会同时影响输入框辅助图标、未选中态复选框等其他组件颜色,如果只需要修改菜单图标颜色,使用方案2。
方案2:样式精准配置(不影响其他组件)
- 先定义PopupMenu专属的主题覆盖层,仅在该层内配置图标颜色:
<style name="ThemeOverlay.App.PopupMenu" parent="ThemeOverlay.Material3.PopupMenu"> <!-- 仅对当前主题下的PopupMenu生效 --> <item name="colorOnSurfaceVariant">@color/colorSecondary</item> <!-- 如需同步修改菜单文字颜色,可新增如下配置 --> <!-- <item name="android:textColor">@color/your_menu_text_color</item> --> </style>
- 给自定义的PopupMenu样式关联上述主题覆盖层,这是之前配置不生效的核心缺失项:
<style name="Widget.App.PopupMenu" parent="Widget.Material3.PopupMenu"> <item name="android:popupBackground">@drawable/menu_back</item> <!-- 关联主题覆盖层,让颜色配置透传到菜单项 --> <item name="materialThemeOverlay">@style/ThemeOverlay.App.PopupMenu</item> </style>
该方案下只有应用了Widget.App.PopupMenu样式的菜单会使用自定义图标色,不会影响其他组件。
方案3:代码动态配置
如果需要根据业务场景动态切换图标颜色,可在PopupMenu初始化后遍历菜单项,手动给图标设置着色:
// 初始化PopupMenu val popupMenu = PopupMenu(context, anchorView) popupMenu.inflate(R.menu.your_menu_resource) // 给所有菜单图标设置目标颜色 val targetColor = ContextCompat.getColor(context, R.color.colorSecondary) popupMenu.menu.forEach { item -> item.icon?.setTint(targetColor) } popupMenu.show()
Java代码逻辑一致,遍历Menu对象逐个给MenuItem的icon设置tint即可。
内容的提问来源于stack exchange,提问作者Mark Delphi
相关产品推荐
相关产品推荐

