解決Android 4.0以上版本中OptionsMenu菜單不顯示ICON圖標的問題


   在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();
  }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM