选项菜单图标无法修改,XML及代码设置后Android Studio仍加载默认图标
问题核心原因
你为菜单项配置了app:actionViewClass="androidx.appcompat.widget.SearchView",当菜单项关联自定义ActionView时,Android系统会优先渲染ActionView本身的布局,默认忽略你在XML、代码中为MenuItem设置的icon属性,这是图标不生效的根本原因。
可选择的解决方案
- 方案1:保留当前ActionView配置,直接修改SearchView内部的默认图标
你可以直接找到SearchView内置的搜索按钮控件替换图标,代码示例如下:override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { inflater.inflate(R.menu.search_menu, menu) val searchItem = menu.findItem(R.id.gps_img) val searchView = searchItem.actionView as SearchView searchView.queryHint = "Current city?" // 替换SearchView默认的搜索图标 val searchIcon = searchView.findViewById<ImageView>(androidx.appcompat.R.id.search_button) searchIcon.setImageResource(R.drawable.ic_baseline_gps_fixed_24) // 可选:替换搜索提交按钮的图标 val submitIcon = searchView.findViewById<ImageView>(androidx.appcompat.R.id.search_go_btn) submitIcon.setImageResource(R.drawable.ic_baseline_gps_fixed_24) searchView.isSubmitButtonEnabled = true searchView.setOnQueryTextListener(this) } - 方案2:实现点击图标再展开SearchView的交互
如果你需要默认显示GPS图标,点击后才展开搜索框,修改XML中菜单项的app:showAsAction属性即可,折叠状态下会自动加载你设置的MenuItem图标:<item android:title="@string/gps" android:id="@+id/gps_img" app:actionViewClass="androidx.appcompat.widget.SearchView" app:showAsAction="ifRoom|collapseActionView" android:icon="@drawable/ic_baseline_gps_fixed_24" /> - 方案3:不需要内嵌SearchView直接删除actionView配置
如果你只是需要点击菜单项触发搜索逻辑,不需要常驻搜索框,直接删除XML中的app:actionViewClass属性,你设置的icon就会正常显示。
额外排查点
如果修改后还是显示异常,可检查是否为图标着色问题:部分主题会默认给菜单图标覆盖统一的着色,你可以在XML中添加app:iconTint属性指定图标颜色,或者代码中调用searchItem.icon.setTint(Color.WHITE)修改着色验证。
内容的提问来源于stack exchange,提问作者Максим Богомолов
相关产品推荐
相关产品推荐

