為什麼說暫時解決了,因為隻是找到了解決方法,還不确定為什麼會這樣,隻能等以後有時間再研究。
先說下情況,采用了 AppCompat Theme,以往舊的方法都不好使,溢出菜單中的圖示死活不顯示,隻有title,網上搜了一堆方案,給出的代碼大都是如下:
@Override
public boolean onMenuOpened(int featureId, Menu menu)
{
if(featureId == Window.FEATURE_ACTION_BAR && menu != null)
{
if(menu.getClass().getSimpleName().equals("MenuBuilder"))
{
try
{
Method m = menu.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE);
m.setAccessible(true);
m.invoke(menu, true);
}
catch(NoSuchMethodException e)
{
Log.e("Menu:", "onMenuOpened", e);
}
catch(Exception e)
{
throw new RuntimeException(e);
}
}
}
return super.onMenuOpened(featureId, menu);
}
後來發現原來是 點選溢出菜單時,回調方法onMenuOpened 一直不執行!
當然此時 菜單的添加方式是
通過getMenuInflater().inflate(R.menu.main, menu); 加載的,将菜單item寫到menu目錄下的xml檔案中,通過這種方法,加載菜單的title,但是onMenuOpened 并未執行,真是奇怪。
備注:如果菜單是通過下面方式添加的,還是可以執行的,進而也能添加溢出菜單中的圖示,
setIconEnable(menu, true);
MenuItem item1 = menu.add(0, 1, 0, R.string.app_name);
item1.setIcon(R.drawable.ofm_qrcode_icon);
MenuItem item2 = menu.add(0, 1, 0, R.string.app_name);
item2.setIcon(R.drawable.ofm_feedback_icon);
return super.onCreateOptionsMenu(menu);
但是這樣麻煩啊,菜單不能通過xml來加載。
至于為什麼采用第一種方式添加菜單時,onMenuOpened 方法不執行,沒找到确定原因,僅在下面頁面中看到一點答複:
https://code.google.com/p/android/issues/detail?id=171440 原文回複是“The reason that onMenuOpened() and onPanelClosed() are not called is that Activity's default implementations of those methods will try and init the framework Action Bar.
We may need to another feature id for AppCompat's action bar.”
隻是看這個,還是不解決眼前問題,不知道到咋做啊。
後來發現,雖然onMenuOpened方法不執行,但是onPrepareOptionsMenu(Menu menu)、onPrepareOptionsPanel(View view, Menu menu) 等都可以執行,
于是采用下面的方法:
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
if (menu != null) {
if (menu.getClass().getSimpleName().equals("MenuBuilder")) {
try {
Method m = menu.getClass().getDeclaredMethod(
"setOptionalIconsVisible", Boolean.TYPE);
m.setAccessible(true);
m.invoke(menu, true);
} catch (Exception e) {
Log.e(getClass().getSimpleName(), "onMenuOpened...unable to set icons for overflow menu", e);
}
}
}
return super.onPrepareOptionsMenu(menu);
}
或者放到
@Override
protected boolean onPrepareOptionsPanel(View view, Menu menu) {
……
//方法語句
……
return super.onPrepareOptionsPanel(view, menu);
}
都可以執行,折騰許久的菜單圖示也終于出來了!