使用反射机制实现菜单Icon的显示

一 目标:
     记事本中的添加弹出式菜单,实现菜单Icon的显示。
 
二、自主学习内容
功能的实现方式:
1.在res中新建menu文件夹-->main.xml文件,如下所示:
   <menu xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools"
     tools:context="com.example.mynote.base_activity"
     android:id="@+id/popup_menu"     
    >            
                <item
                    android:id="@+id/red"
                    android:icon="@drawable/red"
                    android:title="@string/red_title"
                    android:orderInCategory="100"
                    android:showAsAction="never"
                    />
                 <item
                    android:id="@+id/green"              
                    android:icon="@drawable/green"
                    android:title="@string/green_title"
                    android:orderInCategory="100"
                    android:showAsAction="never"
                    />
                  <item
                    android:id="@+id/blue"                  
                    android:icon="@drawable/blue"
                    android:title="@string/blue_title"
                    android:orderInCategory="100"
                    android:showAsAction="never"
                    />
      </menu>

2. 在BaseAcitivity.java加载布局文件过后使用java反射机制的方法解决菜单Icon的显示,代码如下所示:
     case R.id.color:
            Log.d(TAG,"BaseActivity-->onClick-->color");       
             popupMenu=new PopupMenu(this,color);
             getMenuInflater().inflate(R.menu.main, popupMenu.getMenu());
             /*popupMenu.getMenu().getItem(0).setIcon(R.drawable.red);
                             //设置第一个item的图标为red图形资源
             popupMenu.getMenu().getItem(1).setIcon(R.drawable.red);
                             //设置第二个item的图标为red图形资源*/
             //MenuBuilder builder = (MenuBuilder) popupMenu.getMenu().getItem(0);
            
             Menu mymenu = popupMenu.getMenu();
            try {
                Method m = mymenu.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE);
                m.setAccessible(true);
                m.invoke(mymenu, true)
;
            }  catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
             popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener()
              
三、解决的问题:
       1. 通过反射机制解决了菜单Icon不显示的问题;
       2. 如何通过反射机制调取子类不同类型的方法或变量。
 
四、学到了什么:
     1  method.setAccessible(true)方法:AccessibleObject是Method,Field,Constructor的父类,override属性默认为false,可调用setAccessible方法改变,
如果设置为true,则表示可以忽略访问权限的限制,直接调用;
     2  method.invoke(true)方法:执行方法的调用。

五、不足及改善
  反射机制之前就有学习过,但是在写代码时还是会出现动手能力差的问题在,所以以后还需要加强学习。
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值