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)的更多相关文章

  1. Android开发长按菜单上下文菜单

    安卓开发中长按弹出菜单的创建方法: 1.首先给View注册上下文菜单registerForContextMenu(); 2.添加上下文菜单内容onCreateContextMenu(): ---可以通 ...

  2. android学习日记24--Android 菜单开发

    菜单是任何应用程序必不可少的一项.按下Menu键或者长按某个View就会弹出相应菜单,当然前提是应用程序有实现菜单功能. Android平台下的菜单有:Options Menu(选项菜单).Subme ...

  3. Android开发笔记:Android开发环境搭建

    基于Eclipse开发 1. 安装JDK 首先进入JDK下载页面,选择需要的版本下载安装. JDK 下载地址:https://www.oracle.com/technetwork/java/javas ...

  4. Android 开发笔记___实战项目:购物车

    购物车的应用很广泛,电商app基本上都有它的身影.由于它用到了多种存储方式,通过项目对数据的存储有更高层次的了解. 1.设计思路 首先看看购物车的外观.第一次进入时里面是空的,去购物页面加入购物车以后 ...

  5. Android开发系列(二十八):使用SubMenu创建选项菜单

    大部分手机上边都会有一个"MENU"键,在一个应用安装到手机上之后,能够通过"MENU"显示该应用关联的菜单. 可是,从Android 3.0開始,Androi ...

  6. Android开发 ---xml构建选项菜单、上下文菜单(长按显示菜单)、发通知、发送下载通知

    1.activity_main.xml 描述: 定义了一个TextView和三个按钮 <?xml version="1.0" encoding="utf-8&quo ...

  7. Android开发 ---代码创建选项菜单、隐藏菜单项、菜单的生命周期,菜单按钮图标设置、搜索框、xml中设置子菜单

    1.activity_main.xml 描述: 定义了一个按钮 <?xml version="1.0" encoding="utf-8"?> < ...

  8. 安卓开发_浅谈OptionsMenus(选项菜单)

    Android平台下所提供的菜单大体上可分为三类:选项菜单.上下文菜单和子菜单. 当Activity在前台运行时,如果用户按下手机上的Menu键,此时就会在屏幕低端弹出相应的选项菜单.但这个功能需要开 ...

  9. 关于android开发添加菜单XML文件之后无法在R.java中生成ID的问题

    因为和同学分开做的android软件,现在想整合他做的界面部分,于是拷贝了res和src文件夹的文件,其中包括一个res.menu文件夹中的XML.但是每次将该文件导入到工程总无法自动在R.java中 ...

随机推荐

  1. xdoj1321----简单搜索

    1321: 营救公主 时间限制: 1 Sec  内存限制: 128 MB提交: 156  解决: 37[提交][状态][讨论版] 题目描述 DSKer今天又做梦了,他的睡眠质量一直很差.他梦见他化身骑 ...

  2. Uva 816 Abbott's Revenge(BFS)

    #include<cstdio> #include<cstring> #include<vector> #include<queue> using na ...

  3. Blender 画正四面体

    正四面体打开“添加网格”菜单(Shift + A),然后选择“锥形”.将“顶点数”设置为3,将“半径1”保留为默认值1.000,将“半径2”设置为0.000.现在,将深度设置为 {根号2,约等于1.4 ...

  4. 实验吧—隐写术——WP之 Fair-Play

    首先,我们读题发现题目是Playfair​,其实我也不知道这是什么,那么就百度一下啊 Playfair解密算法: 首先将密钥填写在一个5*5的矩阵中(去Q留Z),矩阵中其它未用到的字母按顺序填在矩阵剩 ...

  5. ajax解决跨域

    http://www.cnblogs.com/sunxucool/p/3433992.html 为什么会出现跨域跨域问题来源于JavaScript的同源策略,即只有 协议+主机名+端口号 (如存在)相 ...

  6. javaweb防止表单重复提交

    参考孤傲苍狼 https://www.cnblogs.com/xdp-gacl/p/3859416.html 场景一:在网络延迟的情况下让用户有时间点击多次submit按钮导致表单重复提交 场景二:表 ...

  7. JavaScript 缓存基本原理

    // 这是个闭包函数,接收一个函数,可以把接收的函数转换成具有缓存能力的函数 var memoize = function(f) { // 使用一个 cache 对象来进行缓存 var cache = ...

  8. vue全家桶+Koa2开发笔记(1)--vuex

    1.  安装webpack的问题: webpack坑系列--安装webpack-cli 2.  vue-cli(vue脚手架)超详细教程 3.  在命令行中使用 touch 执行新建文件: 4.  关 ...

  9. js面向对象编程 ---- 系列教程

    原 js面向对象编程:数据的缓存 原 js面向对象编程:如何检测对象类型 原 js面向对象编程:if中可以使用那些作为判断条件呢? 原 js面向对象编程:this到底代表什么?第二篇 原 js面向对象 ...

  10. [转]xargs详解

    为什么要用xargs,问题的来源 在工作中经常会接触到xargs命令,特别是在别人写的脚本里面也经常会遇到,但是却很容易与管道搞混淆,本篇会详细讲解到底什么是xargs命令,为什么要用xargs命令以 ...