上面的代码中,mOptionalIconsVisible成员初始值默认为false,这就是为什么给菜单设置图标没有效果的原因;所以,只要我们在创建菜单时通过调用setOptionalIconsVisible方法设置mOptionalIconsVisible为true就可以了;这时候问题来了,要想调用该方法,就需要创建MenuBuilder对象,但是,我们是无法在开发的应用程序中创建MenuBuilder这个对象的(MenuBuilder为系统内部的框架类);
这时候就需要考虑用反射了,在代码运行创建菜单的时候通过反射调用setOptionalIconsVisible方法设置mOptionalIconsVisible为true,然后在给菜单添加Icon,这样就可以在菜单中显示添加的图标了;
创建菜单方法:
@Override
public boolean
onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds
items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main,
menu);
return true;
}
@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 (Exception e)
{
}
}
}
return
super.onMenuOpened(featureId, menu);
}
@Override
public boolean
onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method
stub
if(item.getItemId()==R.id.process){
ShowProcessListDialog();
}
return
super.onOptionsItemSelected(item);
}
private void
setOverflowShowingAlways() {
// TODO Auto-generated method
stub
try {
ViewConfiguration config =
ViewConfiguration.get(this);
Field menuKeyField =
ViewConfiguration.class
.getDeclaredField("sHasPermanentMenuKey");
menuKeyField.setAccessible(true);
menuKeyField.setBoolean(config,
false);
} catch (Exception e)
{
e.printStackTrace();
}
}
菜单布局文件:main.xml
android:id="@+id/process"
android:orderInCategory="100"
android:showAsAction="always"
android:icon="@drawable/processmenu_selector"
android:title="@string/menu_schedule"/>
android:icon="@drawable/menu_settingphone"
android:title="@string/menu_settingphone"/>
android:icon="@drawable/menu_settingphone"
android:title="@string/menu_Exit"/>
android:icon="@drawable/menu_settingphone"
android:title="@string/menu_Update"/>