前言
         欢迎大家我分享和推荐好用的代码段~~
声明
         欢迎转载,但请保留文章原始出处:
         CSDN:http://www.csdn.net
         雨季o莫忧离:http://blog.csdn.net/luckkof

正文

 

在Android4.0系统中,创建菜单Menu,通过setIcon方法给菜单添加图标是无效的,图标没有显出来,2.3系统中是可以显示出来的。这个问题的根本原因在于4.0系统中,涉及到菜单的源码类 MenuBuilder做了改变,该类的部分源码如下:

[java] view plaincopy
  1. public class MenuBuilder implements Menu {  
  2. ...  
  3. private boolean mOptionalIconsVisible = false;  
  4. ....  
  5.     void setOptionalIconsVisible(boolean visible) {  
  6.         mOptionalIconsVisible = visible;  
  7.     }  
  8.   
  9.     boolean getOptionalIconsVisible() {  
  10.         return mOptionalIconsVisible;  
  11.     }  
  12. ...  
  13. }  

 上面的代码中,mOptionalIconsVisible成员初始值默认为false,这就是为什么给菜单设置图标没有效果的原因;所以,只要我们在创建菜单时通过调用setOptionalIconsVisible方法设置mOptionalIconsVisible为true就可以了;

这时候问题来了,要想调用该方法,就需要创建MenuBuilder对象,但是,我们是无法在开发的应用程序中创建MenuBuilder这个对象的(MenuBuilder为系统内部的框架类);

这时候就需要考虑用反射了,在代码运行创建菜单的时候通过反射调用setOptionalIconsVisible方法设置mOptionalIconsVisible为true,然后在给菜单添加Icon,这样就可以在菜单中显示添加的图标了;

  代码实现如下:

[java] view plaincopy
  1. package com.stevenhu.mie;  
  2.   
  3. import java.lang.reflect.Method;  
  4.   
  5. import android.app.Activity;  
  6. import android.os.Bundle;  
  7. import android.util.Log;  
  8. import android.view.Menu;  
  9. import android.view.MenuItem;  
  10.   
  11. public class MainActivity extends Activity   
  12. {  
  13.     /** Called when the activity is first created. */  
  14.     @Override  
  15.     public void onCreate(Bundle savedInstanceState)  
  16.     {  
  17.         super.onCreate(savedInstanceState);  
  18.         setContentView(R.layout.main);  
  19.     }  
  20.   
  21.     @Override  
  22.     public boolean onCreateOptionsMenu(Menu menu)  
  23.     {  
  24.         //运行时,参数Menu其实就是MenuBuilder对象  
  25.         Log.d("MainActivity""menu--->" + menu);  
  26.           
  27.         /*利用反射机制调用MenuBuilder的setOptionalIconsVisible方法设置mOptionalIconsVisible为true, 
  28.          * 给菜单设置图标时才可见 
  29.          */  
  30.         setIconEnable(menu, true);  
  31.           
  32.         MenuItem item1 = menu.add(010, R.string.item1);  
  33.         item1.setIcon(R.drawable.camera);  
  34.           
  35.         MenuItem item2 = menu.add(010, R.string.item2);  
  36.         item2.setIcon(R.drawable.dial);  
  37.           
  38.         MenuItem item3 = menu.add(010, R.string.item3);  
  39.         item3.setIcon(R.drawable.sms);  
  40.           
  41.         return super.onCreateOptionsMenu(menu);  
  42.     }  
  43.   
  44.     @Override  
  45.     public boolean onPrepareOptionsMenu(Menu menu)   
  46.     {  
  47.         // TODO Auto-generated method stub  
  48.         return super.onPrepareOptionsMenu(menu);  
  49.     }  
  50.       
  51.     //enable为true时,菜单添加图标有效,enable为false时无效。4.0系统默认无效  
  52.     private void setIconEnable(Menu menu, boolean enable)  
  53.     {  
  54.         try   
  55.         {  
  56.             Class<?> clazz = Class.forName("com.android.internal.view.menu.MenuBuilder");  
  57.             Method m = clazz.getDeclaredMethod("setOptionalIconsVisible"boolean.class);  
  58.             m.setAccessible(true);  
  59.               
  60.             //MenuBuilder实现Menu接口,创建菜单时,传进来的menu其实就是MenuBuilder对象(java的多态特征)  
  61.             m.invoke(menu, enable);  
  62.               
  63.         } catch (Exception e)   
  64.         {  
  65.             e.printStackTrace();  
  66.         }  
  67.     }  
  68. }  

   通过上面的代码,就可以实现在Android4.0系统中设置菜单的Icon有效了;

更多相关文章

  1. 也谈Android下一个apk安装多个程序入口图标
  2. 安卓AVD使用建议
  3. [Android]应用界面创建控件的两种方式
  4. android之AIDL跨进程通信详解
  5. 用Tasker转发Android上收到的短信至Telegram
  6. 很通俗易懂的概念Activity,Window,DecorView
  7. Android神技之 使用SVG以及自定义IconFont字体库
  8. MUI如何安卓离线打包,在Android(安卓)Studio创建Hello World离线
  9. 《Android(安卓)JNI》02 对java传进来的整形参数进行操作并返回

随机推荐

  1. Android(安卓)ConstraintLayout 使用
  2. Android性能监测小工具——安测试
  3. Android(安卓)中的 Service 全面总结
  4. android EditText限制输入长度
  5. Android初学者教程
  6. Android——横屏和竖屏的切换,以及明文密
  7. android widget 之EditText
  8. Android(安卓)API包名及包的功能的中文介
  9. Android开机自动启动Wi-Fi热点的方法
  10. Android实例剖析笔记(三)