標籤:
在Android4.0系統中,建立菜單Menu,通過setIcon方法給菜單添加表徵圖是無效的,表徵圖沒有顯出來,2.3系統中是可以顯示出來的。這個問題的根本原因在於4.0系統中,涉及到菜單的源碼類 MenuBuilder做了改變,該類的部分源碼如下:
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,這樣就可以在菜單中顯示添加的表徵圖了;
代碼實現如下:
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(0, 1, 0, R.string.item1); 33 item1.setIcon(R.drawable.camera); 34 35 MenuItem item2 = menu.add(0, 1, 0, R.string.item2); 36 item2.setIcon(R.drawable.dial); 37 38 MenuItem item3 = menu.add(0, 1, 0, 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有效了
解決android4.0系統中菜單(Menu)添加Icon無效問題