android解决菜单Menu添加Icon无效问题,让菜单同时显示图标和文字

今天主要解决在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
在这里插入图片描述

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值