今天在寫一個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