Material Design 1.5.0 Toolbar菜单内边距颜色修改与移除方法
问题描述
自有应用迁移至 Material Design 1.5.0 版本后,Toolbar 弹出的菜单项列表出现异常灰色上下内边距/边框,需要修改该区域显示颜色,或直接移除多余内边距。
原有实现代码
- Activity 布局中引入通用 Toolbar 布局:
<include layout="@layout/toolbar_default" />
toolbar_default.xml布局文件代码:
<?xml version="1.0" encoding="utf-8"?> <com.google.android.material.appbar.MaterialToolbar ... app:theme="@style/defaultToolbarTheme" ... />
- 关联 styles 样式定义:
<style name="defaultToolbarTheme" parent="Theme.MaterialComponents.NoActionBar"> <item name="android:textColorPrimary">?app_toolbar_foreground_color</item> <item name="android:textColorSecondary">?app_toolbar_foreground_color</item> <item name="android:background">@drawable/item_background_menu</item> <item name="android:itemTextAppearance">@style/MyActionBar.MenuTextStyle</item> </style> <style name="MyActionBar.MenuTextStyle" parent="TextAppearance.AppCompat.Widget.ActionBar.Subtitle" />
- 菜单背景选择器
item_background_menu.xml:
<selector> <item android:drawable="@color/blue_click" android:state_pressed="true"/> <item android:drawable="@drawable/item_background_menu_drawable"/> </selector>
- 菜单背景形状资源
item_background_menu_drawable.xml:
<shape> <solid android:color="@color/itemColor"/> </shape>
- 颜色定义:
<color name="itemColor">#1155a2</color>
效果对比
- 迁移前正常菜单效果:

- 迁移后异常效果(上下区域显示系统默认灰色):

解决方案
该问题是 Material Components 1.5.0 版本调整了弹出菜单(MaterialMenuPopup)默认样式导致的,新版本给弹窗容器新增了默认上下内边距,旧版本直接给Toolbar设置背景即可覆盖菜单样式的逻辑不再生效,可根据需求选择以下两种修复方案:
方案1:直接移除多余内边距
在现有样式基础上追加弹窗样式配置,将上下内边距重置为0即可恢复旧版效果:
<style name="defaultToolbarTheme" parent="Theme.MaterialComponents.NoActionBar"> <!-- 保留原有配置项 --> <item name="android:textColorPrimary">?app_toolbar_foreground_color</item> <item name="android:textColorSecondary">?app_toolbar_foreground_color</item> <item name="android:background">@drawable/item_background_menu</item> <item name="android:itemTextAppearance">@style/MyActionBar.MenuTextStyle</item> <!-- 新增以下配置关联自定义弹窗样式 --> <item name="listPopupWindowStyle">@style/MyListPopupNoPadding</item> <item name="android:popupMenuStyle">@style/MyPopupMenuCustomBg</item> </style> <!-- 重置列表弹窗上下内边距为0 --> <style name="MyListPopupNoPadding" parent="Widget.MaterialComponents.ListPopupWindow"> <item name="android:paddingTop">0dp</item> <item name="android:paddingBottom">0dp</item> </style> <!-- 给弹出菜单绑定自定义背景 --> <style name="MyPopupMenuCustomBg" parent="Widget.MaterialComponents.PopupMenu"> <item name="android:popupBackground">@drawable/item_background_menu</item> </style>
方案2:修改内边距区域颜色
如果需要保留默认内边距,仅把灰色区域改成和菜单一致的颜色,不需要重置内边距,直接给弹窗指定统一背景即可:
<style name="defaultToolbarTheme" parent="Theme.MaterialComponents.NoActionBar"> <!-- 保留原有配置项 --> <item name="android:textColorPrimary">?app_toolbar_foreground_color</item> <item name="android:textColorSecondary">?app_toolbar_foreground_color</item> <item name="android:background">@drawable/item_background_menu</item> <item name="android:itemTextAppearance">@style/MyActionBar.MenuTextStyle</item> <!-- 新增行:指定弹出菜单整体背景 --> <item name="android:popupBackground">@drawable/item_background_menu</item> </style>
内容的提问来源于stack exchange,提问作者Tom11
相关产品推荐
相关产品推荐

