在Android4.0系統中,創建菜單Menu,通過setIcon方法給菜單添加圖標是無效的,圖標沒有顯出來,2.3系統中是可以顯示出來的。這個問題的根本原因在於4.0系統中,涉及到菜單的源碼類 MenuBuilder做了改變,該類的部分源碼如下:
public class MenuBuilder implements Menu { ... private boolean mOptionalIconsVisible = false; .... void setOptionalIconsVisible(boolean visible) { mOptionalIconsVisible = visible; } boolean getOptionalIconsVisible() { return mOptionalIconsVisible; } ... }
上面的代碼中,mOptionalIconsVisible成員初始值默認為false,這就是為什么給菜單設置圖標沒有效果的原因;所以,只要我們在創建菜單時通過調用setOptionalIconsVisible方法設置mOptionalIconsVisible為true就可以了;這時候問題來了,要想調用該方法,就需要創建MenuBuilder對象,但是,我們是無法在開發的應用程序中創建MenuBuilder這個對象(MenuBuilder為系統內部的框架類)。
這時候就需要考慮用反射了,在代碼運行創建菜單的時候通過反射調用setOptionalIconsVisible方法設置mOptionalIconsVisible為true,然后在給菜單添加Icon,這樣就可以在菜單中顯示添加的圖標了;
@Override public boolean onCreateOptionsMenu(Menu menu) { setIconEnable(menu, true); //調用這句實現顯示ICON menu.add("新增記事").setIcon(R.drawable.add); menu.add("記事列表").setIcon(R.drawable.list); menu.add("分類管理").setIcon(R.drawable.category); menu.add("官方網站").setIcon(R.drawable.web); menu.add("關於").setIcon(R.drawable.about); menu.add("退出").setIcon(R.drawable.exit); return super.onCreateOptionsMenu(menu); } //enable為true時,菜單添加圖標有效,enable為false時無效。4.0系統默認無效 private void setIconEnable(Menu menu, boolean enable){ try{ Class<?> clazz = Class.forName("com.android.internal.view.menu.MenuBuilder"); Method m = clazz.getDeclaredMethod("setOptionalIconsVisible", boolean.class); m.setAccessible(true); //MenuBuilder實現Menu接口,創建菜單時,傳進來的menu其實就是MenuBuilder對象(java的多態特征) m.invoke(menu, enable); } catch (Exception e){ e.printStackTrace(); } }