解決android4.0系統中菜單(Menu)添加Icon無效問題

在Android4.0系統中,創建菜單Menu,通過setIcon方法給菜單添加圖標是無效的,圖標沒有顯出來,2.3系統中是可以顯示出來的。這個問題的根本原因在於4.0系統中,涉及到菜單的源碼類 MenuBuilder做了改變,該類的部分源碼如下:

[java] view plain copy
  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 plain copy
  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. }  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章