標籤:
在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,這樣就可以在菜單中顯示添加的表徵圖了;
@Overridepublic 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(); }}
解決Android 4.0以上版本中OptionsMenu菜單不顯示ICON表徵圖的問題