Android开发之选项菜单(optinosMenu)
android一共有三种形式的菜单:
1.选项菜单(optinosMenu)
2.上下文菜单(ContextMenu)
3.子菜单(subMenu)
一、选项菜单(optinosMenu)
选项菜单(optionsMenu), 该菜单在点击 menu 按键 后会在对应的Activity底部显示出来。
1、一般需要将创建选项菜单的代码放在onCreateOptionMenu方法中。通过Menu.add方法可以添加一个选项菜单。该方法有4种重载形式,定义如下:
menu.add方法的参数:
第一个int类型的group ID参数,代表的是组概念,你可以将几个菜单项归为一组,以便更好的以组的方式管理你的菜单按钮。
第二个int类型的item ID参数,代表的是项目编号。这个参数非常重要,一个item ID对应一个menu中的选项。在后面使用菜单的时候,就靠这个item ID来判断你使用的是哪个选项。
第三个int类型的order ID参数,代表的是菜单项的显示顺序。默认是0,表示菜单的显示顺序就是按照add的显示顺序来显示。
第四个String类型的title参数,表示选项中显示的文字。
- 1、public MenuItem add(CharSequence title);
- 2、public MenuItem add(int titleRes);
- 3、public MenuItem add(int groupId, int itemId, int order, int titleRes);
- 4、public MenuItem add(int groupId, int itemId, int order, CharSequence title);
MainActivity.java文件:
- menu.add(1,1,1,"菜单一");
- menu.add(1,2,2,"菜单二");
- menu.add(1,3,3,"菜单三");
- menu.add(1,4,4,"菜单四");
效果图:
2、为菜单添加图标
在Android4.0系统中,创建菜单Menu,通过setIcon方法给菜单添加图标是无效的,图标没有显出来,2.3系统中是可以显示出来的。这个问题的根本原因在于4.0系统中,涉及到菜单的源码类 MenuBuilder做了改变,该类的部分源代码如下:
- public class MenuBuilder implements Menu {
- ...
- private boolean mOptionalIconsVisible = false;
- ....
- void setOptionalIconsVisible(boolean visible) {
- mOptionalIconsVisible = visible;
- }
- boolean getOptionalIconsVisible() {
- return mOptionalIconsVisible;
- }
- ...
- }
上面的代码中,mOptionalIconsVisible成员初始值默认为false,这就是为什么给菜单设置图标没有效果的原因;所以,只要我们在创建菜单时通过调用setOptionalIconsVisible方法设置mOptionalIconsVisible为true就可以了;这时候问题来了,要想调用该方法,就需要创建MenuBuilder对象,但是,我们是无法在开发的应用程序中创建MenuBuilder这个对象(MenuBuilder为系统内部的框架类)。
这时候就需要考虑用反射了,在代码运行创建菜单的时候通过反射调用setOptionalIconsVisible方法设置mOptionalIconsVisible为true,然后在给菜单添加Icon,这样就可以在菜单中显示添加的图标了。
- public boolean onCreateOptionsMenu(Menu menu) {
- // Inflate the menu; this adds items to the action bar if it is present.
- setIconEnable(menu, true);
- //调用这句实现显示ICON
- getMenuInflater().inflate(R.menu.main, menu);
- menu.add(1,1,1,"菜单一").setIcon(R.drawable.tabbar_me);
- menu.add(1,2,2,"菜单二").setIcon(R.drawable.tabbar_mainframehl);
- menu.add(1,3,3,"菜单三").setIcon(R.drawable.tabbar_mainframe);
- menu.add(1,4,4,"菜单四"
- ).setIcon(R.drawable.tabbar_mainframehl);
- return true;
- }
- //enable为true时,菜单添加图标有效,enable为false时无效。4.0系统默认无效
- private void setIconEnable(Menu menu, boolean enable)
{
- try
- {
- Class<?> clazz = Class.forName("com.android.internal.view.menu.MenuBuilder");
- Method m = clazz.getDeclaredMethod("setOptionalIconsVisible", boolean.class);
m.setAccessible(true);
- //MenuBuilder实现Menu接口,创建菜单时,传进来的menu其实就是MenuBuilder对象(java的多态特征
- m.invoke(menu, enable);
- }catch(Exception e){
e.printStackTrace();
} }
效果图:
3、实现菜单点击效果:
①设置点击事件:通过调用MenuItem.setOnMenuItemClickListener方法可以设置菜单项的单击事件,该方法有一个OnMenuItemClickListener类型的参数类型的参数,处理菜单项的单击事件类必须实现setOnMenuItemClickListener接口。
②setOnMenuItemClickListener()方法,继承实现setOnMenuItemClickListener接口。
③通过getItemId()获取menu中的选项对应item ID,可以用来做判断,在判断里面写相关的代码。
- public boolean onCreateOptionsMenu(Menu menu) {
- // Inflate the menu; this adds items to the action bar if it is present.
- //调用这句实现显示ICON
- setIconEnable(menu, true);
- getMenuInflater().inflate(R.menu.main, menu);
- Me nuItem item = menu.add(1,1,1,"菜单一").setIcon(R.drawable.tabbar_me);
- menu.add(1,2,2,"菜单二").setIcon(R.drawable.tabbar_mainframehl);
- menu.add(1,3,3,"菜单三").setIcon(R.drawable.tabbar_mainframe);
- menu.add(1,4,4,"菜单四").setIcon(R.drawable.tabbar_mainframehl);
- item.setOnMenuItemClickListener(this); return true;
- }
- public boolean onMenuItemClick(MenuItem item) {
- if(item.getItemId()==1){
- Toast.makeText(MainActivity.this, "点击了菜单项1", Toast.LENGTH_SHORT).show();
- }
- return false;
- }
- //enable为true时,菜单添加图标有效,enable为false时无效。4.0系统默认无效
- private void setIconEnable(Menu menu, boolean enable)
{- try{
Class<?> clazz = Class.forName("com.android.internal.view.menu.MenuBuilder");
Method m = clazz.getDeclaredMethod("setOptionalIconsVisible", boolean.class);
m.setAccessible(true);
- //MenuBuilder实现Menu接口,创建菜单时,传进来的menu其实就是MenuBuilder对象(java的多态特征
- m.invoke(menu, enable);
}catch(Exception e){
e.printStackTrace(); } }
效果图:
Android开发之选项菜单(optinosMenu)的更多相关文章
- Android开发长按菜单上下文菜单
安卓开发中长按弹出菜单的创建方法: 1.首先给View注册上下文菜单registerForContextMenu(); 2.添加上下文菜单内容onCreateContextMenu(): ---可以通 ...
- android学习日记24--Android 菜单开发
菜单是任何应用程序必不可少的一项.按下Menu键或者长按某个View就会弹出相应菜单,当然前提是应用程序有实现菜单功能. Android平台下的菜单有:Options Menu(选项菜单).Subme ...
- Android开发笔记:Android开发环境搭建
基于Eclipse开发 1. 安装JDK 首先进入JDK下载页面,选择需要的版本下载安装. JDK 下载地址:https://www.oracle.com/technetwork/java/javas ...
- Android 开发笔记___实战项目:购物车
购物车的应用很广泛,电商app基本上都有它的身影.由于它用到了多种存储方式,通过项目对数据的存储有更高层次的了解. 1.设计思路 首先看看购物车的外观.第一次进入时里面是空的,去购物页面加入购物车以后 ...
- Android开发系列(二十八):使用SubMenu创建选项菜单
大部分手机上边都会有一个"MENU"键,在一个应用安装到手机上之后,能够通过"MENU"显示该应用关联的菜单. 可是,从Android 3.0開始,Androi ...
- Android开发 ---xml构建选项菜单、上下文菜单(长按显示菜单)、发通知、发送下载通知
1.activity_main.xml 描述: 定义了一个TextView和三个按钮 <?xml version="1.0" encoding="utf-8&quo ...
- Android开发 ---代码创建选项菜单、隐藏菜单项、菜单的生命周期,菜单按钮图标设置、搜索框、xml中设置子菜单
1.activity_main.xml 描述: 定义了一个按钮 <?xml version="1.0" encoding="utf-8"?> < ...
- 安卓开发_浅谈OptionsMenus(选项菜单)
Android平台下所提供的菜单大体上可分为三类:选项菜单.上下文菜单和子菜单. 当Activity在前台运行时,如果用户按下手机上的Menu键,此时就会在屏幕低端弹出相应的选项菜单.但这个功能需要开 ...
- 关于android开发添加菜单XML文件之后无法在R.java中生成ID的问题
因为和同学分开做的android软件,现在想整合他做的界面部分,于是拷贝了res和src文件夹的文件,其中包括一个res.menu文件夹中的XML.但是每次将该文件导入到工程总无法自动在R.java中 ...
随机推荐
- 小白入门photoscan
1.安装 我装的是photoscanPro 1.4.5版本.[注]:刚开始是在官网上下载的,要收费就点了试用,结果当我等了一天把将近200张图片处理完后,告诉我试用版不能保存文件...(绝望-_- - ...
- 利用Git hub创建博客
1.准备工作 到Git官网 下载Git,并且配置环境变量 2.注册Git Hub账号 到Git Hub官网注册相关账号,比如本文的账号为13627225740L,并至New repository创建仓 ...
- React两三事
在setState中改变变量的状态应该用,this .state....而不是 this.props...
- P3084 [USACO13OPEN]照片Photo (dp+单调队列优化)
题目链接:传送门 题目: 题目描述 Farmer John has decided to assemble a panoramic photo of a lineup of his N cows ( ...
- python性能分析——insert()
我们在list中插入数据时,经常使用这两个函数: append():在列表的末尾增加一个数据 insert():在某个特定位置前加一个数据 Python内的list实现是通过数组实现的,而不是链表的形 ...
- MyBatis sql语句使用总结
MyBatis中Like语句使用总结 oracle数据库: SELECT * FROM user WHERE name like CONCAT('%',#{name},'%') 或 : SELECT ...
- java利用Comparator接口对自定义数组排序
import java.util.Arrays; import java.util.Comparator; public class MySort { public static void main( ...
- 实验吧—Web——WP之 简单的sql注入之2
直接打开解题连接: 既然是SQL注入,那么我们就要构造注入语句了,这个就要有耐心一个一个去尝试了 输入语句 1'and 1=1 # 和 1'and/**/1=1/**/#后 对比一下,发现是过滤掉了空 ...
- 《DSP using MATLAB》Problem 5.32
代码: function [y] = ovrlpadd_v3(x, h, N) %% Overlap-Add method of block convolution %% -------------- ...
- lapis 1.7.0 更好的openresty 版本兼容以及安全数据库支持
lapis 1.7.0 今年4月2号就发布了,一直没有注意,今天看到changelog就简单的进行了一个 测试(主要是与openresty版本的测试,新变更后边会有) 使用docker-compose ...