android 4.0 Menu的一些问题(学习笔记)

时间:2021-01-18 15:29:56

一 由于android版本的问题 ,在4.0版本之后不能设置Icon

       (网络回答)

      在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有效了;


二 将手机MENU键关联到ActivityBar右边的三点

         在oncreate 里调用下面的方法即可

    private void setOverflowButtonAlways() 
    {
   
    try {
    ViewConfiguration config = ViewConfiguration.get(this);
    Field menuKey = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");
                menuKey.setAccessible(true);
                menuKey.setBoolean(config, false);

       catch (Exception e) {
e.printStackTrace();
}
    } 


三 如何想在4.0 版本里面想实现低版本的Menu的布局

      android 4.0 Menu的一些问题(学习笔记)

请删除values-v11和 values-v14(忘了原理。。。。抱歉。。。)