今天主要解决在Android 4.0 以上的系统中,依旧使用的是反射,但是我们只需要重写一个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设置点击事件
注意: public boolean onCreateOptionsMenu(Menu menu) {}这个方法里面,一定要重写!!!,也就是说,如果你的menu中已经定义好了item,也要重写 onCreateOptionsMenumenu()
首先先贴上来menu文件
不会创建menu文件的小伙伴们看这里
https://blog.csdn.net/weixin_44025103/article/details/89472478
好了,现在就假设你已经学会如何在Android中创建menu了,本人的menu如下(画外音,需要从copy的直接ctrl+C 就好了):
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/user"
android:icon="@drawable/hand_icon"
android:showAsAction="always"
android:title="用户"/>
<item
android:id="@+id/publish"
android:icon="@drawable/hand_icon"
android:showAsAction="always"
android:title="发布"/>
<item
android:id="@+id/favourite"
android:icon="@drawable/hand_icon"
android:showAsAction="never"
android:title="收藏"/>
</menu>
这里我要提示一下,这个 android:showAsAction="XXXX"属性,studio中是会报错的,而且会让你用 android:showAppAction=“XXXX”。无视他,无视红色波浪线。对,不用理他,也绝对没事。
贴上来onCreateOptionsMenu
@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.hand_icon);
menu.add(Menu.NONE, Menu.FIRST + 2, 0, "菜单2").setIcon(R.drawable.hand_icon);
return true;
}
然后,就是重头戏————看不懂没关系,直接copy完事
//显示menu上的图片
/* 利用反射机制调用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);
}
最后监听一下menu,也好让Android明白,咱们到底按的是哪个menu选项
@Override
public boolean onOptionsItemSelected(MenuItem item) {
Log.e("TAG", "走这个方法2");
switch (item.getItemId()) {
case R.id.user: {
Intent intent= new Intent(this,MainActivity.class);
startActivity(intent);
return true;
}
case R.id.publish: {
Toast.makeText(this, "see", Toast.LENGTH_SHORT).show();
return true;
}
case R.id.favourite: {
Toast.makeText(this, "state", Toast.LENGTH_SHORT).show();
return true;
}
}
return super.onOptionsItemSelected(item);
}
总而言之,就是一句话,看不懂的复制,有红色标识的修改变量名。最后,像我一样懒的小伙伴一定不愿意去自己找图片,那我就大发慈悲,把图片也给大家贴上来。
hand_icon.png