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. 第8次Scrum会议(10/20)【欢迎来怼】

    一.小组信息 队名:欢迎来怼 小组成员 队长:田继平 成员:李圆圆,葛美义,王伟东,姜珊,邵朔,冉华 小组照片 二.开会信息 时间:2017/10/20 17:20~17:45,总计25min. 地点 ...

  2. CodeForces 682A

    D - Alyona and Numbers Time Limit:1000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Sub ...

  3. [Educational Codeforces Round 55 (Rated for Div. 2)][C. Multi-Subject Competition]

    https://codeforc.es/contest/1082/problem/C 题目大意:有m个类型,n个人,每个人有一个所属类型k和一个能力v,要求所选的类型的人个数相等并且使v总和最大(n, ...

  4. stm32l071cbt6片内flash操作

    今天在看片内flash的操作,发现按照下面的操作并没有写成功: unsigned long temp = 0x12345678; HAL_FLASH_Unlock(); FLASH_PageErase ...

  5. redux笔记 进阶

    1 拆分UI组件和容器组件 import React from 'react' const AppUI = (props) =>{ return ( <div className=&quo ...

  6. 用setuptools_scm来自动控制Python包的版本

    手动管理Python包的版本号一段时间后,寻求自动化的手段,是自然而然的. 手动管理版本 手动管理Python包的版本,需要注意两个方面: 每次发布新包前,要更新包的版本号. 在安装后的默认模块下应该 ...

  7. terraform 几个方便的工具

    几个方便的terraform 工具,方便了解terraform terraform-docs 方便的查看资源的信息(支持markdown,json 格式),对于ci/cd 很方便 项目地址 https ...

  8. Go语言实战 (William,Kennedy 等著)

    第1章 关于Go语言的介绍 (已看) 1.1 用Go解决现代编程难题 1.1.1 开发速度 1.1.2 并发 1. goroutine 2. 通道 1.1.3 Go语言的类型系统 1. 类型简单 2. ...

  9. 人教版高中数学(A版)

    必修1 (已看) 第一章 集合与函数概念 1.1 集合 1.2 函数及其表示 1.3 函数的基本性质 第二章 基本初等函数(1) 2.1 指数函数 2.2 对数函数 2.3 幂函数 第三章 函数的应用 ...

  10. 20165308 2017-2018-2 《Java程序设计》第三周学习总结

    20165308 2017-2018-2 <Java程序设计>第三周学习总结 知识点 类 构造方法与对象的创建 类与程序的基本结构 参数传值 对象的组合 实力成员与类成员 方法重载 thi ...