Android4.0以上版本OptionsMenu無法顯示圖標的問題


天在寫一個OptionsMenu的時候,雖然在xml文件當中加入了icon屬性,但是那個圖標弄死就是顯示不出來。

情況是這樣的,這是我配置的list_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/menu_insert"
        android:icon="@android:drawable/ic_menu_add"
        android:title="@string/menu_insert"
        />
</menu>

就拿這一個菜單項目爲例, icon屬性設置了一個ic_menu_add, 下面看這段正常不過的java代碼:

  @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        MenuInflater mi = getMenuInflater();
        mi.inflate(R.menu.list_menu, menu);
        return true;
    }

代碼就不解釋了, 很開心部署到手機, 點Menu按鈕之後整個人都不好了,

沒有圖標

沒有ICON. 翻牆出去找google幫忙. 以下解決辦法, 改編自http://stackoverflow.com/questions/19750635/icon-in-menu-not-showing-in-android, 多謝外國猿~

谷歌的高大尚你不懂的, 他硬生生就不讓你在Menu裏面顯示圖標. 據說(傑米沒有去深究這個啦)谷歌在4.0以後, 將menu中的setOptionalIconsVisible這個方法, 變成了私有的… 並且默認值爲false. 你懂的… 這意味着設置一百遍icon都是徒勞… 這時傑米想起了張孝祥老師講過的一個關於反射的故事…

既然知道有這麼一個私有的方法可以設置icon的顯示狀態, 就暴力解決問題吧~

反射得到menu的setOptionalIconsVisible方法, 然後呵呵

  private void setIconsVisible(Menu menu, boolean flag) {
        //判斷menu是否爲空
        if(menu != null) {
            try {
                //如果不爲空,就反射拿到menu的setOptionalIconsVisible方法
                Method method = menu.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE);
                //暴力訪問該方法
                method.setAccessible(true);
                //調用該方法顯示icon
                method.invoke(menu, flag);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

搞了這個一個方法, 然後在onCreateOptionsMenu裏面一調, 整個人就好了~

圖標

反射萬歲~ 猿類萬歲~

KEEP CALM AND CARRY ON


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章