关于解决android4.0系统中菜单无法添加Icon的问题

在Android4.0系统中,创建菜单Menu,然后通过setIcon方法给菜单添加图标是无效的,图标不会显出来,而之前的系统中是可以显示出来的。这个问题的根本原因在于4.0系统中,涉及到菜单的源码类 MenuBuilder做了改变,其中有private boolean mOptionalIconsVisible = false;属性使得无法显示菜单图标。

但是,我们又无法在开发的应用程序中创建MenuBuilder这个对象的(因为MenuBuilder是系统内部的框架类)。

当然如果不是很需要还挺建议不用的,或者换一种方式。要是非得用而且还要非得用setIcon的方法,那就只有通过反射机制来实现了调用setOptionalIconsVisible方法设置mOptionalIconsVisible为true

  //自己编写设置菜单图标有效函数
  //参数menu就是onCreateOptionsMenu(Menu menu) 中的参数menu
  //所以该函数要使用在它里面 使用,并且要在你使用setIcon()之前调用。
    private void setIconEnable(Menu menu, boolean enable)
    {
        try
        {
            Class<?> c = Class.forName("com.android.internal.view.menu.MenuBuilder");
            Method m = c.getDeclaredMethod("setOptionalIconsVisible", boolean.class);
            m.setAccessible(true);
            m.invoke(menu, enable);  

        } catch (Exception e)
        {
            e.printStackTrace();
        }
    }
时间: 2025-01-13 11:14:02

关于解决android4.0系统中菜单无法添加Icon的问题的相关文章

解决android4.0系统中菜单(Menu)添加Icon无效问题

在Android4.0系统中,创建菜单Menu,通过setIcon方法给菜单添加图标是无效的,图标没有显出来,2.3系统中是可以显示出来的.这个问题的根本原因在于4.0系统中,涉及到菜单的源码类 MenuBuilder做了改变,该类的部分源码如下: 1 public class MenuBuilder implements Menu { 2 ... 3 private boolean mOptionalIconsVisible = false; 4 .... 5 void setOptional

解决在ubuntu系统中安装Chrome失败的问题

1. 下载 Google Chrome 文件名,例如: google-chrome-stable_current_i386.deb 2. 在命令行下安装 直接用软件中心打开将会有可能因为依赖关系不完整导致失败,在命令行下进入包含安装包.deb文件的目录, 然后: $ sudo dpkg -i google-chrome-stable_current_i386.deb 如果报告依赖关系错误,例如: dpkg:依赖关系问题使得 google-chrome-stable 的配置工作不能继续: goog

64位系统中为VS2012添加OpenGL工具包

之前一直都是按照网上教程进行的添加,以前使用的系统是32位的,所以一直都没有问题.最近换了64位系统,要使用到OpenGL,于是就又进行了原来的工作,但进行测试时,老是失败: 但是在目录:"C:\Windows\System32"下我已经放了这个dll,于是思考会不会是因为64位系统的问题,所以就在"glut32.dll"和"glut.dll"拷贝了一份放到了"C:\Windows\System"下,再次运行,发现已经能够正常

嵌入式系统中为什么要添加操作系统?(转)

原帖地址:http://blog.sina.com.cn/s/blog_8f396e370100vjs0.html 嵌入式系统中为什么要添加操作系统?这个问题很多人都能回答,并且也一定要很多答案.当外行问及我这个问题的时候,我说是想让程序脱离硬件,提高程序的可移植性和可读性:另外就是当系统比较复杂的情况下,操作系统可以为这个复杂的系统提供管理机制,开发人员只要完成功能函数,并且添加任务即可,不用再去管不同的任务之间通信以及各个不同功能之间如何协同工作等等的问题.但是这样说出来,似乎没法让他们感受

Linux——解决RedHat6/CentOS6系统中“弹出界面eth0:设备似乎不存在”的问题

刚刚在自己的CentOS6系统中执行service network restart时,竟然提示: 弹出界面 eth0: 设备 似乎不存在, 初始化操作将被延迟.   [失败] 这事可真神奇.于是手动编辑网卡配置文件/etc/sysconfig/network-scripts/ifcfg-eth0,根据自己的忘记进行了一番设置,再次执行service network restart,竟然又弹出一个: 弹出界面 eth0: 错误:没有找到合适的设备:没有找到可用于连接 'eth0' 的设备. 后来发

从源代码剖析Struts2中用户自定义配置转换器的两种方式——基于字段的配置转换器和基于类型的配置转换器(解决了实际系统中,因没有区分这两种工作方式的生命周期而引起的异常错误问题)

自定义类型转换器必须实现ongl.TypeConverter接口或对这个接口的某种具体实现做扩展 <<interface>>com.opensymphony.xwork2.conversion.TypeConverter à com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter à org.apache.struts2.util.StrutsTypeConverter 接口及类进行解析 TypeConverter(

Android4.0系统接收不到广播的问题解析

在3.1之后,系统的package manager增加了对处于“stopped state”应用的管理,这个stopped和Activity生命周期中的stop状态是完全两码事,指的是安装后从来没有启动过和被用户手动强制停止的应用,与此同时系统增加了2个Flag:FLAG_INCLUDE_STOPPED_PACKAGES和FLAG_EXCLUDE_STOPPED_PACKAGES ,来标识一个intent是否激活处于“stopped state”的应用.当2个Flag都不设置或者都进行设置的时候

如何在RedHat 7.0系统中安装mysql 5.7.22

今天给大家介绍一下如何安装mysql5.7,在安装之前,首先要查看的是,你的系统中有没有已经安装过的情况.键入rpm -qa|grep mysql,如果无任何显示,则表示没有安装过相关组件,如果有,则根据显示出来的名字,键入rpm -e --nodeps ************** (星号为你要删除的文件名字).接着键入rpm -qa|grep mariadb,同样的步骤,把出现的文件删除.两步都完成后,可以开始下载所需要的包了. 下载需要的版本: MYSQL官网:https://dev.my

Linux系统中为php添加pcntl扩展的方法

1.首先看下 phpize命令 所在的目录  (ps:我的目录/usr/bin/phpize)如果没有找到的话 执行安装 yum install php53_devel (ps:请注意自己的版本) 安装完毕后.会生成phpize命令 2.去php.net下载相应版本的php源文件咱们以php-5.3.17 为例吧,解压后,进入相应的模块下 cd ext/pcntl#先执行phpize/usr/bin/phpize./configure --with-php-config=/usr/bin/php