Android按键之Menu详解
Android手机一般都有三个键,返回键、Home键、菜单键;
Android系统的菜单支持主要通过4个接口来实现。
从上图可以看出Menu是一个父类接口,它下面有两个子类一个是ContextMenu:它表示是一个上下文菜单,SubMenu表示一个子菜单。它们都可以包含一个或多个的MenuItem菜单项
Menu接口定义了两个方法来添加菜单项和添加子菜单。一个通过add()方法添加菜单项,addSubMenu()方法来添加子菜单。而SubMenu与ContextMenu继承了Munu接口的方法之外,还提供了一些的方法。比如设置菜单的标题、图标等;
开发菜单和子菜单有两种方式;一是在Activity重写的方法onCreateOptionsMenu(Menu menu)方法中调用menu对象添加,然后在重写Activity的onOptionsItemSelected来响应选择的菜单项。二是通过资源文件来定义菜单项,然后在onCreateOptionsMenu方法中加载这个xml资源。onCreateOptionsMenu方法在单击Menu键时触发。
而开发上下文菜单与上类似:分为三个步骤:一是重写onCreateContextMenu(ContextMenu menu,View source,ContextMenu.MenuInfo info)方法,然后调用registerForContextMenu(View viwe)方法为控件注册上下文菜单,最后重写onContextItemSelected(Menuitem item)来响应选择的菜单项
实例如下:
1、代码中添加:
- package com.android.xiong.memu;
- import android.os.Bundle;
- import android.app.Activity;
- import android.app.AlertDialog;
- import android.app.AlertDialog.Builder;
- import android.view.ContextMenu;
- import android.view.ContextMenu.ContextMenuInfo;
- import android.view.Menu;
- import android.view.MenuItem;
- import android.view.SubMenu;
- import android.view.View;
- import android.widget.Button;
- public class MainActivity extends Activity {
- // 定义菜单项的ItemId
- private final int NEWS = 00;
- private final int COLOR = 01;
- private final int FONT = 02;
- private final int RED = 001;
- private final int BULE = 002;
- private final int GREED = 003;
- private final int BIG = 004;
- private final int SMALL = 005;
- Builder bu;
- Button show;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- bu = new AlertDialog.Builder(this);
- show = (Button) findViewById(R.id.context);
- // 为Button注册上下文菜单
- registerForContextMenu(show);
- }
- // 用户单击Menu键时触发
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- // 添加新建菜单项
- menu.add(0, NEWS, 0, "新建");
- // 添加颜色子菜单
- SubMenu color = menu.addSubMenu(0, COLOR, 0, "颜色");
- color.setHeaderTitle("选择颜色");
- color.add(0, RED, 0, "红色");
- color.add(0, BULE, 0, "蓝色");
- color.add(0, GREED, 0, "绿色");
- // 添加字体的菜单
- SubMenu font = menu.addSubMenu(0, FONT, 0, "字体");
- font.setHeaderTitle("选择字体");
- font.add(0, BIG, 0, "大字体");
- font.add(0, SMALL, 0, "小字体");
- return super.onCreateOptionsMenu(menu);
- }
- // 当用户单击菜单项触发
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case RED:
- bu.setMessage("红色").setPositiveButton("确定", null).show();
- break;
- case BULE:
- bu.setMessage("蓝色").setPositiveButton("确定", null).show();
- break;
- case GREED:
- bu.setMessage("绿色").setPositiveButton("确定", null).show();
- break;
- case BIG:
- bu.setMessage("大号").setPositiveButton("确定", null).show();
- break;
- case SMALL:
- bu.setMessage("小号").setPositiveButton("确定", null).show();
- break;
- case NEWS:
- bu.setMessage("新建").setPositiveButton("确定", null).show();
- break;
- }
- return true;
- }
- // 长按组件响应的上下文菜单
- @Override
- public void onCreateContextMenu(ContextMenu menu, View v,
- ContextMenuInfo menuInfo) {
- menu.add(0, RED, 0, "红色");
- menu.add(0, BULE, 0, "蓝色");
- menu.add(0, GREED, 0, "绿色");
- }
- // 点击上下文菜单项触发
- @Override
- public boolean onContextItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case RED:
- bu.setMessage("红色").setPositiveButton("确定", null).show();
- break;
- case BULE:
- bu.setMessage("蓝色").setPositiveButton("确定", null).show();
- break;
- case GREED:
- bu.setMessage("绿色").setPositiveButton("确定", null).show();
- break;
- }
- return true;
- }
- }
2、XML资源定义菜单
- <menu xmlns:android="http://schemas.android.com/apk/res/android" >
- <!-- 添加菜单项 -->
- <item
- android:id="@+id/menu_news"
- android:title="@string/news"/>
- <!-- 添加子菜单 -->
- <item
- android:title="@string/color" >
- <menu>
- <!-- 单项选择 -->
- <group android:checkableBehavior="single">
- <!-- 选中红色 -->
- <item android:id="@+id/color_red"
- android:checked="true"
- android:title="@string/red"/>
- <item android:id="@+id/color_bule"
- android:title="@string/bule"/>
- <item android:id="@+id/color_greed"
- android:title="@string/greed"/>
- </group>
- </menu>
- </item>
- <item
- android:title="@string/font" >
- <menu>
- <!-- 多项选择 -->
- <group android:checkableBehavior="all">
- <item android:id="@+id/font_big"
- android:title="@string/big"/>
- <item android:id="@+id/font_Small"
- android:title="@string/small"/>
- </group>
- </menu>
- </item>
- </menu>
- package com.android.xiong.menu2;
- import android.os.Bundle;
- import android.app.Activity;
- import android.app.AlertDialog;
- import android.app.AlertDialog.Builder;
- import android.view.ContextMenu;
- import android.view.ContextMenu.ContextMenuInfo;
- import android.view.Menu;
- import android.view.MenuItem;
- import android.view.View;
- import android.widget.Button;
- public class MainActivity extends Activity {
- Button show;
- Builder bu;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- bu = new AlertDialog.Builder(this);
- show=(Button)findViewById(R.id.bt_show);
- registerForContextMenu(show);
- }
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- getMenuInflater().inflate(R.menu.main, menu);
- return super.onCreateOptionsMenu(menu);
- }
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case R.id.color_red:
- bu.setMessage("红色").setPositiveButton("确定", null).show();
- break;
- case R.id.color_bule:
- bu.setMessage("蓝色").setPositiveButton("确定", null).show();
- break;
- case R.id.color_greed:
- bu.setMessage("绿色").setPositiveButton("确定", null).show();
- break;
- case R.id.font_big:
- bu.setMessage("大号").setPositiveButton("确定", null).show();
- break;
- case R.id.font_Small:
- bu.setMessage("小号").setPositiveButton("确定", null).show();
- break;
- case R.id.menu_news:
- bu.setMessage("新建").setPositiveButton("确定", null).show();
- break;
- }
- return true;
- }
- @Override
- public void onCreateContextMenu(ContextMenu menu, View v,
- ContextMenuInfo menuInfo) {
- getMenuInflater().inflate(R.menu.main, menu);
- }
- @Override
- public boolean onContextItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case R.id.color_red:
- bu.setMessage("红色").setPositiveButton("确定", null).show();
- break;
- case R.id.color_bule:
- bu.setMessage("蓝色").setPositiveButton("确定", null).show();
- break;
- case R.id.color_greed:
- bu.setMessage("绿色").setPositiveButton("确定", null).show();
- break;
- case R.id.font_big:
- bu.setMessage("大号").setPositiveButton("确定", null).show();
- break;
- case R.id.font_Small:
- bu.setMessage("小号").setPositiveButton("确定", null).show();
- break;
- case R.id.menu_news:
- bu.setMessage("新建").setPositiveButton("确定", null).show();
- break;
- }
- return true;
- }
- }
Android按键之Menu详解的更多相关文章
- 《Android NFC 开发实战详解 》简介+源码+样章+勘误ING
<Android NFC 开发实战详解>简介+源码+样章+勘误ING SkySeraph Mar. 14th 2014 Email:skyseraph00@163.com 更多精彩请直接 ...
- Android本地化资源目录详解
我们可以设想,有两个不同分辨率的手机(320*480和480*800)要使用一些图像资源,为了使图像不失真,就需要为不同分辨率的手机指定不同的图像,为此就需要建立不同的资源目录. 在res目录中建立了 ...
- Android开发之InstanceState详解
Android开发之InstanceState详解 本文介绍Android中关于Activity的两个神秘方法:onSaveInstanceState() 和 onRestoreInstanceS ...
- ANDROID L——Material Design详解(UI控件)
转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! Android L: Google已经确认Android L就是Android Lolli ...
- android bundle存放数据详解
转载自:android bundle存放数据详解 正如大家所知道,Activity之间传递数据,是将数据存放在Intent或者Bundle中 例如: 将数据存放倒Intent中传递: 将数据放到Bun ...
- Cordova 打包 Android release app 过程详解
Cordova 打包 Android release app 过程详解 时间 -- :: SegmentFault 原文 https://segmentfault.com/a/119000000517 ...
- Android中Service(服务)详解
http://blog.csdn.net/ryantang03/article/details/7770939 Android中Service(服务)详解 标签: serviceandroidappl ...
- 给 Android 开发者的 RxJava 详解
我从去年开始使用 RxJava ,到现在一年多了.今年加入了 Flipboard 后,看到 Flipboard 的 Android 项目也在使用 RxJava ,并且使用的场景越来越多 .而最近这几个 ...
- Android中mesure过程详解
我们在编写layout的xml文件时会碰到layout_width和layout_height两个属性,对于这两个属性我们有三种选择:赋值成具体的数值,match_parent或者wrap_conte ...
随机推荐
- mybatis 打印sql 语句
拦截器 package com.cares.asis.mybatis.interceptor; import java.text.DateFormat; import java.util.Date; ...
- 。net 添加或获取文件关联
文件关联设置 2011-02-07 14:25:36| 分类: VB.net2008或2010 | 标签:文件关联 |举报|字号 订阅 原理:以后缀名为.txt为例 方式一: 1.在注册 ...
- CSS3中:nth-child和:nth-of-type的区别深入理解
关于:nth-child和:nth-of-type的区别之前一直没太注意.最近打算深入了解一些CSS3,才发现里面其实暗藏玄机. :nth-child可以选择父元素下的字元素,:nth-of-type ...
- VMware12 安装 CentOS 6.5 64位
前言:本人在配置Hadoop的过程中,需要搭建Cent OS 64 环境,借此,顺便将Cent OS 64 的安装在此记录,方便自己,也方便大家学习.本次是在VM12虚拟机中实现Cent OS 64 ...
- C# IEnumerable,Lambda表达式和 Parallel并行编程的用法
以前一直主要做C++和C方面的项目,对C#不太了解熟悉,但听说不难,也就一直没有在意学习C#方面的知识.今天有个C#项目,需要做些应用的扩展,同时修改一些bug.但看了C#代码,顿时觉得有些不适应了. ...
- poj 3613 经过k条边最短路 floyd+矩阵快速幂
http://poj.org/problem?id=3613 s->t上经过k条边的最短路 先把1000范围的点离散化到200中,然后使用最短路可以使用floyd,由于求的是经过k条路的最短路, ...
- struts2--表单重复提交
1.表单重复提交: --使用struts2的Token或TokenSession拦截器避免重复提交: > 上述两个拦截器均不在默认的拦截器栈中,需要在struts.xml中配置: > To ...
- Nginx下实现pathinfo及ThinkPHP的URL Rewrite模式支持
打开Nginx的配置文件 /usr/local/nginx/conf/nginx.conf 一般是在这个路径,根据你的安装路径可能有所变化.如果你配置了vhost,而且只需要你这一个vhost支持pa ...
- TeraData金融数据模型
Teradata天睿公司(纽交所代码:TDC),是美国前十大上市软件公司之一.经过逾30 年的发展,Teradata天睿公司已经成为全球最大的专注于大数据分析.数据仓库和整合营销管理解决方案的供应商. ...
- Microsoft 家族新成员 Datazen 移动BI 介绍
开篇介绍 Microsoft 在上个月即 2015年4月份收购了 Datazen www.datazen.com, Datazen 专注于移动 BI 和数据可视化领域,并且它的基本部署与配置架构都是基 ...