Android:如何移除/修改按钮点击/长按状态下的边框
解决KitKat真机上菜单图标方形高亮的问题
嘿,这个KitKat上的菜单图标高亮差异问题我之前也踩过坑!模拟器和真机的行为不一致确实闹心,而且不想写一堆XML文件的话,有几个轻量的解决方案:
方案1:单个XML selector覆盖默认高亮(几乎零额外代码)
只需要创建一个极简的drawable文件,完全算不上“大量XML”:
- 在
res/drawable下新建menu_item_transparent_bg.xml:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 按压状态下用透明背景 --> <item android:state_pressed="true" android:drawable="@android:color/transparent"/> <!-- 默认状态也透明 --> <item android:drawable="@android:color/transparent"/> </selector>
- 打开你的主题样式文件(比如
res/values/styles.xml),给当前主题添加这个属性:
<style name="YourAppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- 替换ActionBar菜单项的默认背景 --> <item name="android:actionBarItemBackground">@drawable/menu_item_transparent_bg</item> </style>
这个方法全局生效,所有菜单项都会去掉方形高亮,改动极小。
方案2:纯代码动态修改(无需额外XML)
如果你连一个XML文件都不想加,可以直接在代码里搞定单个菜单项:
在onCreateOptionsMenu方法里加入这段代码:
@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.your_menu_file, menu); // 找到目标菜单项 MenuItem targetItem = menu.findItem(R.id.your_menu_item_id); // 创建透明的状态列表Drawable StateListDrawable transparentBg = new StateListDrawable(); // 按压状态设为透明 transparentBg.addState(new int[]{android.R.attr.state_pressed}, new ColorDrawable(Color.TRANSPARENT)); // 默认状态也透明 transparentBg.addState(new int[]{}, new ColorDrawable(Color.TRANSPARENT)); // 给菜单项的ActionView设置背景,覆盖默认高亮 View actionView = new View(this); actionView.setBackground(transparentBg); targetItem.setActionView(actionView); return true; }
这个方法完全不需要新增XML文件,适合只需要修改单个菜单项的场景。
额外小技巧:保留圆形高亮(可选)
如果你不想完全去掉高亮,只想让高亮和图标匹配成圆形,可以把方案1里的透明Drawable换成圆形Shape。比如写一个圆形的selector,这样按压时就只会高亮图标本身的圆形区域了。
内容的提问来源于stack exchange,提问作者lasagnakid77
相关产品推荐
相关产品推荐

