今天主要解决在Android 4.0 以上的系统中,在java代码中给菜单Menu动态添加Icon无效问题。本人通过尝试网上给出的涉及到菜单的源码类 MenuBuilder通过反射更改mOptionalIconsVisible成员初始值默认值false为true的方法,结果并不奏效,图标还是没有显示出来。最后我找到了有效的方法,虽然依旧使用的是反射,但是我们只需要重写一个onMenuOpened()方法即可。
1.只需要重新这一方法
/* 利用反射机制调用MenuBuilder的setOptionalIconsVisible方法设置mOptionalIconsVisible为true,给菜单设置图标时才可见
* 让菜单同时显示图标和文字
*/
@Override
public boolean onMenuOpened(int featureId, Menu menu) {
if (menu != null) {
if (menu.getClass().getSimpleName().equalsIgnoreCase("MenuBuilder")) {
try {
Method method = menu.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE);
method.setAccessible(true);
method.invoke(menu, true);
} catch (Exception e) {
e.printStackTrace();
}
}
}
return super.onMenuOpened(featureId, menu);
}
2.我在Activity里面创建menu的代码,并且给menu设置点击事件
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//使用menu文件
//getMenuInflater().inflate(R.menu.menu_main, menu);
//动态创建menu文件
// Inflate the menu; this adds items to the action bar if it is present.
menu.add(Menu.NONE, Menu.FIRST + 1, 0, "菜单1").setIcon(R.drawable.icon_homepage);
menu.add(Menu.NONE, Menu.FIRST + 2, 0, "菜单2").setIcon(R.drawable.icon_homepage);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
super.onOptionsItemSelected(item);
switch (item.getItemId()) //得到被点击的item的itemId
{
case Menu.FIRST + 1: //对应的ID就是在add方法中所设定的Id
AppToast.makeShortToast(MainActivity.this, "Menu.FIRST+1");
break;
case Menu.FIRST + 2:
AppToast.makeShortToast(MainActivity.this, "Menu.FIRST+2");
break;
}
return true;
}
3.一切搞定,上一张截图。