菜单是用户界面中最常见的元素之一,使用非常频繁,在Android中,菜单被分为如下三种,选项菜单(OptionsMenu)、上下文菜单(ContextMenu)和子菜单(SubMenu)。

菜单的实现方式有2种:一种是通过布局文件xml生成菜单,另一种是通过代码生成。

三种菜单内容有点多,不过大体相似,一次性讲完吧,本人偏好代码动态生成,下面就以代码为例。

1、选项菜单(OptionsMenu)

先来看下选项菜单的效果图:

 

在一个Activity界面中点击手机Menu键,在屏幕下方弹出的菜单就叫选项菜单(OptionsMenu)。

创建一个选项菜单的步骤:
1、覆写Activity的onCreateOptionsMenu(Menu menu)函数
2、调用menu的add()方法添加菜单项(MenuItem),可以调用MenuItem的setIcon()方法来为菜单设置图标
3、当菜单项()被选择时,我们可以通过覆盖Activity的onOptionsItemSeleted()方法来响应事件

先来了解下主要的方法:

   public boolean onCreateOptionsMenu(Menu menu)://使用此方法调用OptionsMenu 。

   public boolean onOptionsItemSelected(MenuItem item)://选中菜单项后发生的动作。

   public void onOptionsMenuClosed(Menu menu): //菜单关闭后发生的动作。

   public boolean onPrepareOptionsMenu(Menu menu)://选项菜单显示之前onPrepareOptionsMenu方法会被调用,你可以用此方法来根据打当时的情况调整菜单。

   public boolean onMenuOpened(int featureId, Menu menu)://单打开后发生的动作。

下面来看个小Demo,注释很全。

 package com.example.menutest;

 import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast; /**
*
* @author Balla_兔子
* 用代码动态生成菜单(选项菜单)
*
*/
public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
} @Override
//onCreateOptionsMenu()此方法只会调用一次,即第一次显示的时候会调用.
public boolean onCreateOptionsMenu(Menu menu) {
// MenuItem item1=menu.add(1, 1, 1, "第一个选项菜单");
// item1.setTitle("第一个选项菜单");
// item1.setIcon(R.drawable.ic_launcher);
menu.add(1, 1, 1, "第一个选项菜单");
menu.add(1, 2, 1, "第二个选项菜单");
menu.add(1, 3, 1, "第三个选项菜单");
menu.add(1, 4, 1, "第四个选项菜单");
return super.onCreateOptionsMenu(menu);
} @Override
//如果需要更新菜单项.可以在onPrepareOptionsMenu()方法中操作.
public boolean onPrepareOptionsMenu(Menu menu) {
Toast.makeText(this, "菜单显示器前执行的方法", Toast.LENGTH_SHORT).show();
return super.onPrepareOptionsMenu(menu);
} @Override
public void onOptionsMenuClosed(Menu menu) {
Toast.makeText(this, "菜单关闭后执行的方法", Toast.LENGTH_SHORT).show();
super.onOptionsMenuClosed(menu);
} @Override
//当菜单被选择的时候,在OnOptionsItemSelected()方法中实现.
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()){//获取菜单id
case 1:
//可以通过Intent跳转界面
Intent intent=new Intent(MainActivity.this, HelloWorld.class);
item.setIntent(intent);
break;
case 2:
Toast.makeText(this, "第二个选项菜单被点击", Toast.LENGTH_SHORT).show();
break;
case 3:
Toast.makeText(this, "第三个选项菜单被点击", Toast.LENGTH_SHORT).show();
break;
case 4:
Toast.makeText(this, "第四个选项菜单被点击", Toast.LENGTH_SHORT).show();
break;
}
return super.onOptionsItemSelected(item);
} }

上面例子中,在创建菜单方法onCreateOptionsMenu()中有个add方法,它的返回值是一个MenuItem,我们可以根据它的返回值来设置更多选择,例如菜单图标等。

来看下它的参数,下面是它对应的API文档中的解释:参数1:分组,参数2:标示符id,参数3:排序,参数4:菜单文字

2、上下文菜单

国际惯例,先来看下效果图:

 什么是上下文菜单?

Android 的上下文菜单类似于Windows上的右键菜单。当为一个视图注册了上下文菜单之后,长按(2 秒左右)这个视图对象就会弹出一个浮动菜单,即上下文菜单。任何视图都可以注册上下文菜单,不过,最常见的是用于列表视图ListView的item。

创建上下文菜单步骤:

1、 覆写 Activity 的 onCreateContenxtMenu() 方法,调用 Menu 的 add 方法添加菜单项(MenuItem)。

2、覆盖 Activity 的 onContextItemSelected() 方法,响应上下文菜单菜单项的单击事件。

3、调用 registerForContextMenu() 方法,为视图注册上下文菜单。

下面直接上个小Demo演示了,对于ListView组件这里就不再给注释了,不清楚的朋友可以翻下我以前写的文章。

 package com.example.menutest;

 import android.app.Activity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast; /**
*
* @author Balla_兔子
* 用代码动态生成菜单(上下文菜单)
*
*/
public class MainActivity extends Activity { private ListView listview;
private ArrayAdapter<String> adapter;
private String info[]={"选项1","选项2","选项3","选项4","选项5","选项6"}; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//创建一个ListView列表
listview=(ListView) findViewById(R.id.listview);
adapter=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, info);
listview.setAdapter(adapter); //给当前View注册上下文菜单.
this.registerForContextMenu(listview); } @Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
menu.setHeaderTitle("我是上下文菜单");//设置上下文菜单题目
menu.setHeaderIcon(R.drawable.ic_launcher);//设置上下文菜单题目图标
menu.add(1, 1, 1, "我是上下文菜单选项1");
menu.add(1, 2, 1, "我是上下文菜单选项2");
menu.add(1, 3, 1, "我是上下文菜单选项3");
menu.add(1, 4, 1, "我是上下文菜单选项4");
} @Override
public boolean onContextItemSelected(MenuItem item) {
switch(item.getItemId()){
case 1:
Toast.makeText(this, "点击上下文菜单选项1", Toast.LENGTH_SHORT).show();
break;
case 2:
Toast.makeText(this, "点击上下文菜单选项2", Toast.LENGTH_SHORT).show();
break;
case 3:
Toast.makeText(this, "点击上下文菜单选项3", Toast.LENGTH_SHORT).show();
break;
case 4:
Toast.makeText(this, "点击上下文菜单选项4", Toast.LENGTH_SHORT).show();
break; }
return super.onContextItemSelected(item);
} @Override
//关闭上下文菜单触发此方法
public void onContextMenuClosed(Menu menu) {
Toast.makeText(this, "关闭上下文菜单", Toast.LENGTH_SHORT).show();
} }

3、子菜单

先看下效果图:

 

创建子菜单的步骤:
1、 覆写Activity的onCreateOptionsMenu()方法,调用Menu的addSubMenu()方法来添加子菜单
2、 调用SubMenu的add()方法,添加子菜单项(addSubMenu)
3、 覆写onOptionsItemSelected()方法,响应子菜单的单击事件

  子菜单提供了一种自然的组织菜单项的方式,我们可以通过addSubMenu(int groupId, int itemId, int order, int titleRes)方法非常方便的创建和响应子菜单。

代码和之前创建选项菜单,上下文菜单差不多,直接上代码了:

 package com.example.menutest;

 import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.widget.Toast; /**
*
* @author Balla_兔子
* 用代码动态生成菜单(子菜单)
*
*/
public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
SubMenu s1=menu.addSubMenu(1, 0, 1, "我是菜单1");
s1.setIcon(R.drawable.ic_launcher);//设置子菜单图标
s1.setHeaderTitle("子菜单");//设置子菜单标题
s1.add(1, 1, 1, "我是子菜单1");
s1.add(1, 2, 1, "我是子菜单2");
s1.add(1, 3, 1, "我是子菜单3");
s1.add(1, 4, 1, "我是子菜单4"); SubMenu s2=menu.addSubMenu(2, 0, 1, "我是菜单2");
s2.setIcon(R.drawable.ic_launcher);
s2.setHeaderTitle("子菜单");
s2.add(2, 1, 1, "我是子菜单(1)");
s2.add(2, 2, 1, "我是子菜单(2)");
s2.add(2, 3, 1, "我是子菜单(3)");
s2.add(2, 4, 1, "我是子菜单(4)"); return super.onCreateOptionsMenu(menu);
} @Override
public boolean onOptionsItemSelected(MenuItem item) {
if(item.getGroupId()==1){//判断分组
switch(item.getItemId()){
case 1:
Toast.makeText(MainActivity.this, "菜单1的子菜单1被点击", Toast.LENGTH_SHORT).show();
break;
case 2:
Toast.makeText(MainActivity.this, "菜单1的子菜单2被点击", Toast.LENGTH_SHORT).show();
break;
case 3:
Toast.makeText(MainActivity.this, "菜单1的子菜单3被点击", Toast.LENGTH_SHORT).show();
break;
case 4:
Toast.makeText(MainActivity.this, "菜单1的子菜单4被点击", Toast.LENGTH_SHORT).show();
break; }
}else if(item.getGroupId()==2){
switch(item.getItemId()){
case 1:
Toast.makeText(MainActivity.this, "菜单2的子菜单1被点击", Toast.LENGTH_SHORT).show();
break;
case 2:
Toast.makeText(MainActivity.this, "菜单2的子菜单2被点击", Toast.LENGTH_SHORT).show();
break;
case 3:
Toast.makeText(MainActivity.this, "菜单2的子菜单3被点击", Toast.LENGTH_SHORT).show();
break;
case 4:
Toast.makeText(MainActivity.this, "菜单2的子菜单4被点击", Toast.LENGTH_SHORT).show();
break;
}
} return super.onOptionsItemSelected(item);
} }

安卓开发笔记——Menu菜单组件(选项菜单,上下文菜单,子菜单)的更多相关文章

  1. 安卓开发笔记——Fragment+FragmentTabHost组件(实现新浪微博底部菜单)

    记得之前写过2篇关于底部菜单的实现,由于使用的是过时的TabHost类,虽然一样可以实现我们想要的效果,但作为学习,还是需要来了解下这个新引入类FragmentTabHost 之前2篇文章的链接: 安 ...

  2. 安卓开发笔记——Fragment+ViewPager组件(高仿微信界面)

    什么是ViewPager? 关于ViewPager的介绍和使用,在之前我写过一篇相关的文章<安卓开发复习笔记——ViewPager组件(仿微信引导界面)>,不清楚的朋友可以看看,这里就不再 ...

  3. 安卓开发笔记——关于开源组件PullToRefresh实现下拉刷新和上拉加载(一分钟搞定,超级简单)

    前言 以前在实现ListView下拉刷新和上拉加载数据的时候都是去继承原生的ListView重写它的一些方法,实现起来非常繁杂,需要我们自己去给ListView定制下拉刷新和上拉加载的布局文件,然后添 ...

  4. 安卓开发笔记——关于开源项目SlidingMenu的使用介绍(仿QQ5.0侧滑菜单)

    记得去年年末的时候写过这个侧滑效果,当时是利用自定义HorizontalScrollView来实现的,效果如下: 有兴趣的朋友可以看看这篇文件<安卓开发笔记——自定义HorizontalScro ...

  5. 安卓开发笔记——自定义广告轮播Banner(实现无限循环)

    关于广告轮播,大家肯定不会陌生,它在现手机市场各大APP出现的频率极高,它的优点在于"不占屏",可以仅用小小的固定空位来展示几个甚至几十个广告条,而且动态效果很好,具有很好的用户& ...

  6. 安卓开发笔记——深入Activity

    在上一篇文章<安卓开发笔记——重识Activity >中,我们了解了Activity生命周期的执行顺序和一些基本的数据保存操作,但如果只知道这些是对于我们的开发需求来说是远远不够的,今天我 ...

  7. 安卓开发笔记——丰富多彩的TextView

    随手笔记,记录一些东西~ 记得之前写过一篇文章<安卓开发笔记——个性化TextView(新浪微博)>:http://www.cnblogs.com/lichenwei/p/4411607. ...

  8. 安卓开发笔记——打造万能适配器(Adapter)

    为什么要打造万能适配器? 在安卓开发中,用到ListView和GridView的地方实在是太多了,系统默认给我们提供的适配器(ArrayAdapter,SimpleAdapter)经常不能满足我们的需 ...

  9. 安卓开发笔记——关于Handler的一些总结(上)

    接上篇文章<安卓开发笔记——关于AsyncTask的使用>,今天来讲下在安卓开发里"重中之重"的另一个异步操作类Handler. 今天打算先讲下关于Handler的一些 ...

随机推荐

  1. Android背景颜色渐变

    ●使用XML的方式为背景添加渐变效果 1.在res/drawable文件夹里添加一个jbshape.xml文件,然后写入如下代码: <?xml version="1.0" e ...

  2. SQL 分页 SQL SERVER 2008

    public IList<UserInfo> GetPageList(int pageSize, int pageIndex, out int totalItemCount) { var ...

  3. Java Web项目部署时 “Exploded Archive”模式部署时无效

    在myeclipse中部署项目时,当Deploy type为Exploded Archive(deveplopment mode)时,finish按钮为灰色,无法部署的解决方法: 1.project上 ...

  4. python 高级知识点

    1.切片:截取List,tuple指定范围内的值:>>L[0,3] 2.如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Ite ...

  5. Android 两级菜单栏

    这里来记录下,android 的两级菜单栏,就是顶部切换,和底部的切换.因为在这个上面整了太久的时间,所以特此记录下. 第一种: 先介绍一个网上别人写出来的效果吧,这个当时积分真的很高..CSDN30 ...

  6. java中的设计模式一 装饰模式

    1.装饰模式(Decorator)的定义:又名包装(Wrapper)模式,装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 2.装饰模式以对客户端透明的方式动态的给一个对象附加上 ...

  7. zookeeper学习:知识点收集

    其实学习zookeeper挺简单的,找一本书或者网上的资源,按照其中的例子做一遍就大致了解了.之前是自己学习的方法有问题. 1. 会启动单机版的服务器,并使用客户端连接,然后进行节点的各种操作 2. ...

  8. JAVA ZIP 处理文件

    压缩文件 public static void main(String[] args) throws IOException { String filePath = "E:\\技术部员工工作 ...

  9. 如何提高JavaScript代码质量

    如何编写可维护的JavaScript代码 代码风格及规范 构建检查工具 jshint配置 http://jshint.com/docs/options/ http://www.cnblogs.com/ ...

  10. webpack1--安装与初始化

    webpack可用于打包所有的脚本,图片,样式表及其他资源. 今天来讲一下如何安装webpack 及 创建package.json.webpack依赖于npm和 node,所以本文是假设你已安装好了n ...