求助:如何在Action溢出菜单中显示图标
解决Action溢出菜单不显示图标的问题
我之前也碰到过一模一样的问题——Android从API 11开始,系统就默认把溢出菜单里的图标给隐藏了,哪怕你在menu.xml里明明设置了android:icon属性也没用。不过放心,不用修改你的菜单结构就能搞定,针对你的Target SDK 23、Minimum SDK 16的情况,给你两个可行的方案:
方案一:用反射强制让图标显示
这是最通用的方法,在你的Activity里重写onMenuOpened方法,通过反射调用系统菜单的内部方法来开启图标显示:
@Override public boolean onMenuOpened(int featureId, Menu menu) { if (menu != null && menu.getClass().getSimpleName().equals("MenuBuilder")) { try { // 反射获取MenuBuilder的setOptionalIconsVisible方法 Method showIconsMethod = menu.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE); showIconsMethod.setAccessible(true); // 调用方法让图标可见 showIconsMethod.invoke(menu, true); } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { // 捕获异常,避免崩溃 e.printStackTrace(); } } return super.onMenuOpened(featureId, menu); }
原理很简单:系统的溢出菜单本质是MenuBuilder类的实例,它有个隐藏的方法setOptionalIconsVisible专门控制图标是否显示,我们通过反射激活这个方法就行,这个方案在API 16到23的版本里都能稳定工作。
方案二:配合AppCompat主题增强(如果用了AppCompat库)
如果你的项目用了AppCompat支持库,可以在主题样式里加一些配置,再配合上面的反射方法,效果更稳妥:
在styles.xml里添加:
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- 你的其他主题属性 --> <item name="actionOverflowMenuStyle">@style/CustomOverflowMenu</item> </style> <style name="CustomOverflowMenu" parent="Widget.AppCompat.PopupMenu.Overflow"> <!-- 可选:调整图标间距、分割线等样式 --> <item name="android:iconSpacing">8dp</item> <item name="android:showDividers">none</item> <!-- 关键:确保菜单容器可见 --> <item name="android:visible">true</item> </style>
不过单独的样式设置可能在部分系统版本里不生效,所以还是建议和反射方法一起用。
最后检查一下
别忘了确认你的menu.xml里已经正确设置了图标属性,比如:
<item android:id="@+id/action_example" android:icon="@drawable/ic_example" android:title="@string/action_example_title" android:showAsAction="never"/>
这样就能在不改动菜单结构的前提下,让溢出菜单里的图标显示出来啦!
内容的提问来源于stack exchange,提问作者Priyanka
相关产品推荐
相关产品推荐

