You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,从根源控制背景样式:

  1. 创建菜单项布局(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"/>
  1. 修改菜单XML,指定app:actionLayout属性:
<item
    android:id="@+id/action_filter"
    android:title="filters"
    app:showAsAction="collapseActionView|ifRoom"
    app:actionLayout="@layout/custom_menu_filter"/>
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 02:40:26