Android:如何修改Toolbar中菜单项的背景
解决Toolbar菜单项背景设置问题
要给showAsAction类型的Toolbar菜单项本身设置背景,直接通过菜单XML属性或给图标添加layer-list的方式无效,可通过以下两种方案实现:
方法一:获取菜单项View并设置背景
在onCreateMenu中延迟获取菜单项对应的View,再直接设置背景:
override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) { menuInflater.inflate(R.menu.menu, menu) val filterItem = menu.findItem(R.id.action_filter) // 延迟执行,确保菜单项View已渲染完成 binding.searchAnimeToolbar.post { // 遍历Toolbar子View,定位目标菜单项容器 for (i in 0 until binding.searchAnimeToolbar.childCount) { val child = binding.searchAnimeToolbar.getChildAt(i) if (child is ActionMenuView) { for (j in 0 until child.childCount) { val itemChild = child.getChildAt(j) if (itemChild is ActionMenuItemView && itemChild.itemId == R.id.action_filter) { // 设置自定义背景 itemChild.background = ContextCompat.getDrawable(requireContext(), R.drawable.menu_item_bg) // 调整内边距优化显示效果 itemChild.setPadding(16, 8, 16, 8) break } } break } } } }
对应的背景drawable(res/drawable/menu_item_bg.xml):
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true"> <shape android:shape="rectangle"> <solid android:color="@color/opacity_green_pressed"/> <corners android:radius="4dp"/> </shape> </item> <item> <shape android:shape="rectangle"> <solid android:color="@color/opacity_green"/> <corners android:radius="4dp"/> </shape> </item> </selector>
方法二:自定义ActionView(推荐)
通过指定自定义布局作为菜单项的ActionView,从根源控制背景样式:
- 创建菜单项布局(
res/layout/custom_menu_filter.xml):
<ImageView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/menu_icon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="12dp" android:background="@drawable/menu_item_bg" android:src="@drawable/ic_slider" android:tint="@color/green"/>
- 修改菜单XML,指定
app:actionLayout属性:
<item android:id="@+id/action_filter" android:title="filters" app:showAsAction="collapseActionView|ifRoom" app:actionLayout="@layout/custom_menu_filter"/>
- 在
onCreateMenu中绑定点击事件:
override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) { menuInflater.inflate(R.menu.menu, menu) val filterItem = menu.findItem(R.id.action_filter) filterItem.actionView?.setOnClickListener { Toast.makeText(context, "coming soon", Toast.LENGTH_LONG).show() // 若使用collapseActionView,手动触发折叠 filterItem.collapseActionView() } }
注意事项
- 方法一中必须使用
post延迟执行,因为onCreateMenu执行时Toolbar菜单项View尚未完全渲染,直接查找会失败。 - 方法二不依赖Toolbar内部View结构,兼容性更强,更推荐使用。
内容的提问来源于stack exchange,提问作者KudaGonsih
相关产品推荐
相关产品推荐

