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、代码中添加:

  1. package com.android.xiong.memu;
  2. import android.os.Bundle;
  3. import android.app.Activity;
  4. import android.app.AlertDialog;
  5. import android.app.AlertDialog.Builder;
  6. import android.view.ContextMenu;
  7. import android.view.ContextMenu.ContextMenuInfo;
  8. import android.view.Menu;
  9. import android.view.MenuItem;
  10. import android.view.SubMenu;
  11. import android.view.View;
  12. import android.widget.Button;
  13. public class MainActivity extends Activity {
  14. // 定义菜单项的ItemId
  15. private final int NEWS = 00;
  16. private final int COLOR = 01;
  17. private final int FONT = 02;
  18. private final int RED = 001;
  19. private final int BULE = 002;
  20. private final int GREED = 003;
  21. private final int BIG = 004;
  22. private final int SMALL = 005;
  23. Builder bu;
  24. Button show;
  25. @Override
  26. protected void onCreate(Bundle savedInstanceState) {
  27. super.onCreate(savedInstanceState);
  28. setContentView(R.layout.activity_main);
  29. bu = new AlertDialog.Builder(this);
  30. show = (Button) findViewById(R.id.context);
  31. // 为Button注册上下文菜单
  32. registerForContextMenu(show);
  33. }
  34. // 用户单击Menu键时触发
  35. @Override
  36. public boolean onCreateOptionsMenu(Menu menu) {
  37. // 添加新建菜单项
  38. menu.add(0, NEWS, 0, "新建");
  39. // 添加颜色子菜单
  40. SubMenu color = menu.addSubMenu(0, COLOR, 0, "颜色");
  41. color.setHeaderTitle("选择颜色");
  42. color.add(0, RED, 0, "红色");
  43. color.add(0, BULE, 0, "蓝色");
  44. color.add(0, GREED, 0, "绿色");
  45. // 添加字体的菜单
  46. SubMenu font = menu.addSubMenu(0, FONT, 0, "字体");
  47. font.setHeaderTitle("选择字体");
  48. font.add(0, BIG, 0, "大字体");
  49. font.add(0, SMALL, 0, "小字体");
  50. return super.onCreateOptionsMenu(menu);
  51. }
  52. // 当用户单击菜单项触发
  53. @Override
  54. public boolean onOptionsItemSelected(MenuItem item) {
  55. switch (item.getItemId()) {
  56. case RED:
  57. bu.setMessage("红色").setPositiveButton("确定", null).show();
  58. break;
  59. case BULE:
  60. bu.setMessage("蓝色").setPositiveButton("确定", null).show();
  61. break;
  62. case GREED:
  63. bu.setMessage("绿色").setPositiveButton("确定", null).show();
  64. break;
  65. case BIG:
  66. bu.setMessage("大号").setPositiveButton("确定", null).show();
  67. break;
  68. case SMALL:
  69. bu.setMessage("小号").setPositiveButton("确定", null).show();
  70. break;
  71. case NEWS:
  72. bu.setMessage("新建").setPositiveButton("确定", null).show();
  73. break;
  74. }
  75. return true;
  76. }
  77. // 长按组件响应的上下文菜单
  78. @Override
  79. public void onCreateContextMenu(ContextMenu menu, View v,
  80. ContextMenuInfo menuInfo) {
  81. menu.add(0, RED, 0, "红色");
  82. menu.add(0, BULE, 0, "蓝色");
  83. menu.add(0, GREED, 0, "绿色");
  84. }
  85. // 点击上下文菜单项触发
  86. @Override
  87. public boolean onContextItemSelected(MenuItem item) {
  88. switch (item.getItemId()) {
  89. case RED:
  90. bu.setMessage("红色").setPositiveButton("确定", null).show();
  91. break;
  92. case BULE:
  93. bu.setMessage("蓝色").setPositiveButton("确定", null).show();
  94. break;
  95. case GREED:
  96. bu.setMessage("绿色").setPositiveButton("确定", null).show();
  97. break;
  98. }
  99. return true;
  100. }
  101. }

2、XML资源定义菜单

  1. <menu xmlns:android="http://schemas.android.com/apk/res/android" >
  2. <!-- 添加菜单项 -->
  3. <item
  4. android:id="@+id/menu_news"
  5. android:title="@string/news"/>
  6. <!-- 添加子菜单 -->
  7. <item
  8. android:title="@string/color" >
  9. <menu>
  10. <!-- 单项选择 -->
  11. <group  android:checkableBehavior="single">
  12. <!-- 选中红色 -->
  13. <item android:id="@+id/color_red"
  14. android:checked="true"
  15. android:title="@string/red"/>
  16. <item android:id="@+id/color_bule"
  17. android:title="@string/bule"/>
  18. <item android:id="@+id/color_greed"
  19. android:title="@string/greed"/>
  20. </group>
  21. </menu>
  22. </item>
  23. <item
  24. android:title="@string/font" >
  25. <menu>
  26. <!-- 多项选择 -->
  27. <group  android:checkableBehavior="all">
  28. <item android:id="@+id/font_big"
  29. android:title="@string/big"/>
  30. <item android:id="@+id/font_Small"
  31. android:title="@string/small"/>
  32. </group>
  33. </menu>
  34. </item>
  35. </menu>
    1. package com.android.xiong.menu2;
    2. import android.os.Bundle;
    3. import android.app.Activity;
    4. import android.app.AlertDialog;
    5. import android.app.AlertDialog.Builder;
    6. import android.view.ContextMenu;
    7. import android.view.ContextMenu.ContextMenuInfo;
    8. import android.view.Menu;
    9. import android.view.MenuItem;
    10. import android.view.View;
    11. import android.widget.Button;
    12. public class MainActivity extends Activity {
    13. Button show;
    14. Builder bu;
    15. @Override
    16. protected void onCreate(Bundle savedInstanceState) {
    17. super.onCreate(savedInstanceState);
    18. setContentView(R.layout.activity_main);
    19. bu = new AlertDialog.Builder(this);
    20. show=(Button)findViewById(R.id.bt_show);
    21. registerForContextMenu(show);
    22. }
    23. @Override
    24. public boolean onCreateOptionsMenu(Menu menu) {
    25. getMenuInflater().inflate(R.menu.main, menu);
    26. return super.onCreateOptionsMenu(menu);
    27. }
    28. @Override
    29. public boolean onOptionsItemSelected(MenuItem item) {
    30. switch (item.getItemId()) {
    31. case R.id.color_red:
    32. bu.setMessage("红色").setPositiveButton("确定", null).show();
    33. break;
    34. case R.id.color_bule:
    35. bu.setMessage("蓝色").setPositiveButton("确定", null).show();
    36. break;
    37. case R.id.color_greed:
    38. bu.setMessage("绿色").setPositiveButton("确定", null).show();
    39. break;
    40. case R.id.font_big:
    41. bu.setMessage("大号").setPositiveButton("确定", null).show();
    42. break;
    43. case R.id.font_Small:
    44. bu.setMessage("小号").setPositiveButton("确定", null).show();
    45. break;
    46. case R.id.menu_news:
    47. bu.setMessage("新建").setPositiveButton("确定", null).show();
    48. break;
    49. }
    50. return true;
    51. }
    52. @Override
    53. public void onCreateContextMenu(ContextMenu menu, View v,
    54. ContextMenuInfo menuInfo) {
    55. getMenuInflater().inflate(R.menu.main, menu);
    56. }
    57. @Override
    58. public boolean onContextItemSelected(MenuItem item) {
    59. switch (item.getItemId()) {
    60. case R.id.color_red:
    61. bu.setMessage("红色").setPositiveButton("确定", null).show();
    62. break;
    63. case R.id.color_bule:
    64. bu.setMessage("蓝色").setPositiveButton("确定", null).show();
    65. break;
    66. case R.id.color_greed:
    67. bu.setMessage("绿色").setPositiveButton("确定", null).show();
    68. break;
    69. case R.id.font_big:
    70. bu.setMessage("大号").setPositiveButton("确定", null).show();
    71. break;
    72. case R.id.font_Small:
    73. bu.setMessage("小号").setPositiveButton("确定", null).show();
    74. break;
    75. case R.id.menu_news:
    76. bu.setMessage("新建").setPositiveButton("确定", null).show();
    77. break;
    78. }
    79. return true;
    80. }
    81. }

Android按键之Menu详解的更多相关文章

  1. 《Android NFC 开发实战详解 》简介+源码+样章+勘误ING

    <Android NFC 开发实战详解>简介+源码+样章+勘误ING SkySeraph Mar. 14th  2014 Email:skyseraph00@163.com 更多精彩请直接 ...

  2. Android本地化资源目录详解

    我们可以设想,有两个不同分辨率的手机(320*480和480*800)要使用一些图像资源,为了使图像不失真,就需要为不同分辨率的手机指定不同的图像,为此就需要建立不同的资源目录. 在res目录中建立了 ...

  3. Android开发之InstanceState详解

    Android开发之InstanceState详解   本文介绍Android中关于Activity的两个神秘方法:onSaveInstanceState() 和 onRestoreInstanceS ...

  4. ANDROID L——Material Design详解(UI控件)

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! Android L: Google已经确认Android L就是Android Lolli ...

  5. android bundle存放数据详解

    转载自:android bundle存放数据详解 正如大家所知道,Activity之间传递数据,是将数据存放在Intent或者Bundle中 例如: 将数据存放倒Intent中传递: 将数据放到Bun ...

  6. Cordova 打包 Android release app 过程详解

    Cordova 打包 Android release app 过程详解 时间 -- :: SegmentFault 原文 https://segmentfault.com/a/119000000517 ...

  7. Android中Service(服务)详解

    http://blog.csdn.net/ryantang03/article/details/7770939 Android中Service(服务)详解 标签: serviceandroidappl ...

  8. 给 Android 开发者的 RxJava 详解

    我从去年开始使用 RxJava ,到现在一年多了.今年加入了 Flipboard 后,看到 Flipboard 的 Android 项目也在使用 RxJava ,并且使用的场景越来越多 .而最近这几个 ...

  9. Android中mesure过程详解

    我们在编写layout的xml文件时会碰到layout_width和layout_height两个属性,对于这两个属性我们有三种选择:赋值成具体的数值,match_parent或者wrap_conte ...

随机推荐

  1. iOS IPv6兼容支持和IPv6审核被拒收集整理

    最近遇到一个大坑:IPv6审核被拒问题,于是广寻解决方案,先把一些可以用资料文档收集起来备用.也希望同行能用得着. 官方文档说明:Supporting IPv6 DNS64/NAT64 Network ...

  2. freeCodeCamp:Factorialize a Number

    计算一个整数的阶乘 如果用字母n来代表一个整数,阶乘代表着所有小于或等于n的整数的乘积. 阶乘通常简写成 n! 例如: 5! = 1 * 2 * 3 * 4 * 5 = 120 /*思路 阶乘等于fo ...

  3. jsp_包含指令

    1.静态包含: <%@ include file="被包含的文件的路径"%> 2.动态包含: 不传递参数:<jsp:include page="{要包含 ...

  4. 编程之美2014挑战赛 复赛 Codehunt平台试题答案

    var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...

  5. 「2013-9-5」Configure WingIDE for better display of East Asian Glyphs

    很久没写软件配置相关的博客了.这次对于 WingIDE 在 Windows 下的字体配置,折腾了好一阵子,略曲折,也反映了「不清楚原理和背景的情况下,盲人摸象的效率低下是必然」这条放之四海而皆准的赤果 ...

  6. 6.6 Android 编译机制的变迁

    我们使用Java开发android,在编译打包APK文件时,会经过以下流程 Java编译器将应用中所有Java文件编译为class文件(JVM运行的是.class文件,而DVM是.dex文件) dx工 ...

  7. iOS 开发中的CGFloat,CGPoint,CGSize和CGRect

    CGGeometry类定义几何元素的结构和操作集合元素的函数 1. 数据类型 CGFloat: 浮点值的基本类型 CGPoint: 表示一个二维坐标系中的点 CGSize: 表示一个矩形的宽度和高度 ...

  8. 关于SQL Server 2008添加用户映射问题 解决办法

    同事一直需要用触发器 但是之前的数据库没有dbo映射 无法添加 查阅了很多资料 不适合自己的问题 所以自己动手丰衣足食 特留下笔记 希望能给遇到相同问题的朋友一个解决的思路

  9. [Xamarin] 透過 intent-filter 來接管 http ,製作偽瀏覽器 (转帖)

    使用Android 的朋友一定對這畫面不陌生在開啟網址的時候,或是Youtube連結的時候,因為Android 發現,你手機安裝的App有哪些可以支援這些東西的瀏覽 所以,就可以使用甚麼東西來進行開啟 ...

  10. js call

    转载地址:http://www.cnblogs.com/sweting/archive/2009/12/21/1629204.html call 方法 请参阅 应用于:Function 对象 要求 版 ...