使用反射机制实现菜单Icon的显示
来源:互联网 发布:nginx last 编辑:程序博客网 时间:2024/06/07 21:46
一 目标:
记事本中的添加弹出式菜单,实现菜单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)方法:执行方法的调用。
五、不足及改善
反射机制之前就有学习过,但是在写代码时还是会出现动手能力差的问题在,所以以后还需要加强学习。
记事本中的添加弹出式菜单,实现菜单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)方法:执行方法的调用。
五、不足及改善
反射机制之前就有学习过,但是在写代码时还是会出现动手能力差的问题在,所以以后还需要加强学习。
0 0
- 使用反射机制实现菜单Icon的显示
- 菜单Icon的显示
- 动态生成菜单和java反射机制的使用
- 反射机制的实现
- 动态菜单----动态生成菜单和java反射机制的使用
- ActionBar溢出菜单的icon不显示的解决方法
- 使用反射机制控制Toast的显示时间
- 使用反射机制控制Toast的显示时间
- 反射机制的使用
- 如何实现ICON右上角的数字显示
- 使用反射机制实现分页
- 使用层显示实现下拉菜单的显示。
- 通过php反射机制实现栏目显示
- 使用反射实现Java下的委托机制
- Unity项目中使用反射机制实现的泛型单例类
- android的actionbar的溢出菜单默认不显示图标icon,怎样弄成微信那样可以显示icon
- C++反射机制的实现
- C++反射机制的实现
- 用实例给新手讲解RSA加密算法
- 转载:X264学习总结
- Swift定义一个全局变量字符串
- 推荐 10 款基于 Bootstrap 框架的扩展
- 单点登录原理
- 使用反射机制实现菜单Icon的显示
- 复习内容
- gitlab使用
- ADB 连接
- IOS Dev Intro - Advanced iPhone Camera Controls
- java HashMap 和HashTable
- Android6.0权限系统
- File中mkdir()和mkdirs()的区别
- 关于onNewIntent的使用