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. 1public MenuItem add(CharSequence title);
  2. 2public MenuItem add(int titleRes);
  3. 3public MenuItem add(int groupId, int itemId, int order, int titleRes);
  4. 4public MenuItem add(int groupId, int itemId, int order, CharSequence title);

MainActivity.java文件:

  1. menu.add(1,1,1,"菜单一");
  2. menu.add(1,2,2,"菜单二");
  3. menu.add(1,3,3,"菜单三");
  4. menu.add(1,4,4,"菜单四");

效果图:

2、为菜单添加图标

在Android4.0系统中,创建菜单Menu,通过setIcon方法给菜单添加图标是无效的,图标没有显出来,2.3系统中是可以显示出来的。这个问题的根本原因在于4.0系统中,涉及到菜单的源码类 MenuBuilder做了改变,该类的部分源代码如下:

  1. public class MenuBuilder implements Menu {
  2. ...
  3.   private boolean mOptionalIconsVisible = false;
  4. ....
  5. void setOptionalIconsVisible(boolean visible) {
  6. mOptionalIconsVisible = visible;
  7. }
  8.  
  9. boolean getOptionalIconsVisible() {
  10. return mOptionalIconsVisible;
  11. }
  12. ...
  13. }

上面的代码中,mOptionalIconsVisible成员初始值默认为false,这就是为什么给菜单设置图标没有效果的原因;所以,只要我们在创建菜单时通过调用setOptionalIconsVisible方法设置mOptionalIconsVisible为true就可以了;这时候问题来了,要想调用该方法,就需要创建MenuBuilder对象,但是,我们是无法在开发的应用程序中创建MenuBuilder这个对象(MenuBuilder为系统内部的框架类)。

  这时候就需要考虑用反射了,在代码运行创建菜单的时候通过反射调用setOptionalIconsVisible方法设置mOptionalIconsVisible为true,然后在给菜单添加Icon,这样就可以在菜单中显示添加的图标了。

  1.  
  1.  
  1. public boolean onCreateOptionsMenu(Menu menu) {
  1. // Inflate the menu; this adds items to the action bar if it is present.
  1. setIconEnable(menu, true);
  1. //调用这句实现显示ICON
  2. getMenuInflater().inflate(R.menu.main, menu);
  3. menu.add(1,1,1,"菜单一").setIcon(R.drawable.tabbar_me);
  4. menu.add(1,2,2,"菜单二").setIcon(R.drawable.tabbar_mainframehl);
  5. menu.add(1,3,3,"菜单三").setIcon(R.drawable.tabbar_mainframe);
  6. menu.add(1,4,4,"菜单四"
  1. ).setIcon(R.drawable.tabbar_mainframehl);
  1. return true;
  2. }
  1. //enable为true时,菜单添加图标有效,enable为false时无效。4.0系统默认无效
  1. private void setIconEnable(Menu menu, boolean enable)
    {
  1. try
  1. {
  1. Class<?> clazz = Class.forName("com.android.internal.view.menu.MenuBuilder");
  1. Method m = clazz.getDeclaredMethod("setOptionalIconsVisible", boolean.class);
    m.setAccessible(true
    );
  1. //MenuBuilder实现Menu接口,创建菜单时,传进来的menu其实就是MenuBuilder对象(java的多态特征
  2.  
  3. m.invoke(menu, enable);
  1. }catch(Exception e){
    e.printStackTrace();
    } }

效果图:

3、实现菜单点击效果:

①设置点击事件:通过调用MenuItem.setOnMenuItemClickListener方法可以设置菜单项的单击事件,该方法有一个OnMenuItemClickListener类型的参数类型的参数,处理菜单项的单击事件类必须实现setOnMenuItemClickListener接口。

②setOnMenuItemClickListener()方法,继承实现setOnMenuItemClickListener接口。

③通过getItemId()获取menu中的选项对应item ID,可以用来做判断,在判断里面写相关的代码。

  1. public boolean onCreateOptionsMenu(Menu menu) {
  2. // Inflate the menu; this adds items to the action bar if it is present.
  3. //调用这句实现显示ICON
  1. setIconEnable(menu, true);
  2.  
  3. getMenuInflater().inflate(R.menu.main, menu);
  1. Me nuItem item = menu.add(1,1,1,"菜单一").setIcon(R.drawable.tabbar_me);
  2. menu.add(1,2,2,"菜单二").setIcon(R.drawable.tabbar_mainframehl);
  3. menu.add(1,3,3,"菜单三").setIcon(R.drawable.tabbar_mainframe);
  4. menu.add(1,4,4,"菜单四").setIcon(R.drawable.tabbar_mainframehl);
  5. item.setOnMenuItemClickListener(this); return true;
  6. }
  7. public boolean onMenuItemClick(MenuItem item) {
  8. if(item.getItemId()==1){
  9. Toast.makeText(MainActivity.this, "点击了菜单项1", Toast.LENGTH_SHORT).show();
  10. }
  11. return false;
  12. }
  1. //enable为true时,菜单添加图标有效,enable为false时无效。4.0系统默认无效
  1. private void setIconEnable(Menu menu, boolean enable)
    {
  2.  
  3. try{
    Class<?> clazz = Class.forName("com.android.internal.view.menu.MenuBuilder");
    Method m = clazz.getDeclaredMethod("setOptionalIconsVisible", boolean.class);
    m.setAccessible(true);
  1. //MenuBuilder实现Menu接口,创建菜单时,传进来的menu其实就是MenuBuilder对象(java的多态特征
  1. 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. jmeter定时器

    一.定时器的作用 1.定时器是在每个sampler(采样器)之前执行的,而不是之后(无论定时器位置在sampler之前还是下面): 2.当执行一个sampler之前时,所有当前作用域内的定时器都会被执 ...

  2. 识别假tf卡工具

    h2testwhttps://www.heise.de/download/product/h2testw-50539使用HaraldBögeholz的免费测试工具H2testw,可以检查存储介质(如硬 ...

  3. Quick Noodle Physics in Blender Tutorial

    https://www.youtube.com/watch?v=Lg7jxAMs60QQuick Noodle Physics in Blender Tutorial 新增平面Plane作为地面; 新 ...

  4. ajax解决跨域

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

  5. 【BZOJ1030】【JSOI2007】文本生成器

    我现在连AC自动姬都不会,怎么办嘛QAQ 原题: JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以 ...

  6. katalog-sync: Reliable Integration of Consul and Kubernetes

    转自:https://medium.com/wish-engineering/katalog-sync-reliable-integration-of-consul-and-kubernetes-eb ...

  7. 手动安装python库

    有些时候由于工作环境的限制如proxy,不能自动安装python 的第三方的库(用python –m pip install package).在这个情况下,只能自己手动安装.以xlwt-1.3.0. ...

  8. YAML Class ID Reference

    Classes Ordered by ID Number ID Class 1 GameObject 2 Component 3 LevelGameManager 4 Transform 5 Time ...

  9. nginx+php windows安装配置

    https://blog.csdn.net/zjiang1994/article/details/72876193 https://blog.csdn.net/bruce_wang_janet/art ...

  10. c# 线程同步各类锁

    1)原子操作(Interlocked):所有方法都是执行一次原子读取或一次写入操作. 2)lock()语句:避免锁定public类型,否则实例将超出代码控制的范围,定义private对象来锁定. 3) ...