原文网址:http://zhouyunan2010.iteye.com/blog/1151215

android提供有三种menu类型 
一.Options Menu(选项菜单) 
这是一组item选项的集合,当用户点击MENU button时,此menu就会出现。如果是3.0以后的版本可以通过action bar直接选择menu item 
二.Context Menu(上下文菜单) 
当用户长按住一个注册了上下文菜单的控件时,会弹出一个上下文菜单,它是一个流式的列表,供用户选择某项 
三.Submenu(子菜单) 
一个item项可以包含一个内嵌的子菜单

1.下面讲如何创建一个Options Menu菜单 
通过xml布局文件创建菜单项

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <menu xmlns:android="http://schemas.android.com/apk/res/android">
  3. <item android:id="@+id/new_game"
  4. android:icon="@drawable/ic_new_game"       <!--菜单图标-->
  5. android:title="@string/new_game" />        <!--菜单文字-->
  6. <item android:id="@+id/help"
  7. android:icon="@drawable/ic_help"
  8. android:title="@string/help" />
  9. </menu>

调用:重写acitvity的onCreateOptionsMenu方法创建菜单

  1. @Override
  2. public boolean onCreateOptionsMenu(Menu menu) {
  3. MenuInflater inflater = getMenuInflater();
  4. inflater.inflate(R.menu.game_menu, menu);
  5. return true;
  6. }

你也可以直接调用menu的add方法直接添加菜单项。

options menu响应用户事件需重写activity的onOptionsItemSelected

  1. @Override
  2. public boolean onOptionsItemSelected(MenuItem item) {
  3. // Handle item selection
  4. switch (item.getItemId()) {
  5. case R.id.new_game:
  6. newGame();
  7. return true;
  8. case R.id.help:
  9. showHelp();
  10. return true;
  11. default:
  12. return super.onOptionsItemSelected(item);
  13. }
  14. }

根据item id分别对选中某选项进行处理。return true表示自己已经处理此方法,不需要父类onOptionsItemSelected进行处理。 
如果你有多个activity都有相同的menu,可以写一个activity实现onCreateOptionsMenu() and onOptionsItemSelected() 方法,然后其他activity继承此activity

在运行时改变menu item的状态 
你需要重写onPrepareOptionsMenu() ,它方便你对item移除,添加,使不可用等 
在android 2.3以下,当用户要每次打开menu时就会调用onPrepareOptionsMenu()方法 
在android 3.0以上,你必须调用invalidateOptionsMenu() 当你要update你的menu时,因为 
action bar是一直出现的。然后系统将调用onPrepareOptionsMenu()更改menu

2.创建一个Context Menu 
上下文菜单相当于pc机上的点击鼠标右键弹出框。当用户长按一选项时,上下文菜单就会出现。你能为任何view创建一个上下文菜单,尽管Context Menu多用于listview。 
要创建一个Context Menu,你首先必须为你的控件注册registerForContextMenu() ,并重写 
onCreateContextMenu() and onContextItemSelected().

  1. @Override
  2. public void onCreateContextMenu(ContextMenu menu, View v,
  3. ContextMenuInfo menuInfo) {
  4. super.onCreateContextMenu(menu, v, menuInfo);
  5. MenuInflater inflater = getMenuInflater();
  6. inflater.inflate(R.menu.context_menu, menu);
  7. }

这里使用布局文件创建菜单项,跟options menu差不多。当然你同样可以使用menu.add()方法创建items。ContextMenu.ContextMenuInfo 对象将提供你选择的选项的额外信息,比如id

  1. @Override
  2. public boolean onContextItemSelected(MenuItem item) {
  3. AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
  4. switch (item.getItemId()) {
  5. case R.id.edit:
  6. editNote(info.id);
  7. return true;
  8. case R.id.delete:
  9. deleteNote(info.id);
  10. return true;
  11. default:
  12. return super.onContextItemSelected(item);
  13. }
  14. }

3.创建submenu 
A submenu is a menu that the user can open by selecting an item in another menu。 
一个子菜单能够从另外一个菜单的选项中被打开。你能为任何一个menu添加子菜单,除了submenu。下面看看如何通过布局文件创建一个submenu

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <menu xmlns:android="http://schemas.android.com/apk/res/android">
  3. <item android:id="@+id/file"
  4. android:icon="@drawable/file"
  5. android:title="@string/file" >
  6. <!-- "file" submenu -->
  7. <menu>
  8. <item android:id="@+id/create_new"
  9. android:title="@string/create_new" />
  10. <item android:id="@+id/open"
  11. android:title="@string/open" />
  12. </menu>
  13. </item>
  14. </menu>

You can also use addSubMenu() to dynamically add a SubMenu to an existing Menu. This returns the new SubMenu object, to which you can add submenu items, using add()

4.其他的menu特性 

Menu groups
 
通过组菜单,你可以同时对一组item进行操作,比如setGroupVisible(),setGroupEnabled(),setGroupCheckable() 
下面给出一个包含组菜单的资源文件

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <menu xmlns:android="http://schemas.android.com/apk/res/android">
  3. <item android:id="@+id/item1"
  4. android:icon="@drawable/item1"
  5. android:title="@string/item1" />
  6. <!-- menu group -->
  7. <group android:id="@+id/group1">
  8. <item android:id="@+id/groupItem1"
  9. android:title="@string/groupItem1" />
  10. <item android:id="@+id/groupItem2"
  11. android:title="@string/groupItem2" />
  12. </group>
  13. </menu>

3个item任然是一个兄弟菜单,不同的是你可以通过组操作一组item 

Checkable menu items
 
通过布局文件创建Checkable menu,可以通过使用item的android:checkable属性 
和group的android:checkableBehavior属性。例如

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <menu xmlns:android="http://schemas.android.com/apk/res/android">
  3. <group android:checkableBehavior="single">
  4. <item android:id="@+id/red"
  5. android:title="@string/red" />
  6. <item android:id="@+id/blue"
  7. android:title="@string/blue" />
  8. </group>
  9. </menu>

APi中: 
The android:checkableBehavior attribute accepts either: 
single 
    Only one item from the group can be checked (radio buttons) 
all 
    All items can be checked (checkboxes) 
none 
    No items are checkable 
由于不会自动改变checkbox的状态,你必须设置checkbox的状态通过isChecked()和setChecked().

  1. @Override
  2. public boolean onOptionsItemSelected(MenuItem item) {
  3. switch (item.getItemId()) {
  4. case R.id.vibrate:
  5. case R.id.dont_vibrate:
  6. if (item.isChecked()) item.setChecked(false);
  7. else item.setChecked(true);
  8. return true;
  9. default:
  10. return super.onOptionsItemSelected(item);
  11. }
  12. }

如果你不手动设置它,当你点击一个选项时,checkbox或者radioButton的状态是不会改变的

Shortcut keys(热键) 
你可以为你item设置快速点击热键 
在配置文件中通过item的属性android:alphabeticShortcut 和 android:numericShortcut 
类文件中通过setAlphabeticShortcut(char) and setNumericShortcut(char).设置的热键不区分大小写

Dynamically adding menu intents 
有时候你希望使用menu item来启动一个activity通过intent。你能在onOptionsItemSelected()使用startActivity() 
然而如果你不确定用户的移动设备是否拥有一个应用程序来处理这个intent,那么你可以使用Dynamically adding menu intents来决定是否添加此item 
一个简单的实例

  1. @Override
  2. public boolean onCreateOptionsMenu(Menu menu){
  3. super.onCreateOptionsMenu(menu);
  4. // Create an Intent that describes the requirements to fulfill, to be included
  5. // in our menu. The offering app must include a category value of Intent.CATEGORY_ALTERNATIVE.
  6. Intent intent = new Intent(null, dataUri);
  7. intent.addCategory(Intent.CATEGORY_ALTERNATIVE);
  8. // Search and populate the menu with acceptable offering applications.
  9. menu.addIntentOptions(
  10. R.id.intent_group,  // Menu group to which new items will be added
  11. 0,      // Unique item ID (none)
  12. 0,      // Order for the items (none)
  13. this.getComponentName(),   // The current activity name
  14. null,   // Specific items to place first (none)
  15. intent, // Intent created above that describes our requirements
  16. 0,      // Additional flags to control items (none)
  17. null);  // Array of MenuItems that correlate to specific items (none)
  18. return true;
  19. }

addIntentOptions()返回的是你添加的item的个数

Allowing your activity to be added to other menus 
如果允许你的activity可以被别的menu添加,必须设置CATEGORY_ALTERNATIVE and/or CATEGORY_SELECTED_ALTERNATIVE values for the intent filter category

    1. <intent-filter label="Resize Image">
    2. ...
    3. <category android:name="android.intent.category.ALTERNATIVE" />
    4. <category android:name="android.intent.category.SELECTED_ALTERNATIVE" />
    5. ...
    6. </intent-filter>
    7. 还有一个notePad的示例我在研究研究

【转】android小结(一)之menu的更多相关文章

  1. android学习笔记37——Menu资源

    Menu菜单资源 android应用推荐使用XML来定义菜单,其可提供更好的解耦方式. 菜单资源通常位于res/menu文件夹下,其菜单根元素为<menu.../>,menu元素下可包含子 ...

  2. Android开发手记(12) Menu的使用

    Android中的Menu分为三种,分别为:OptionsMenu(选项菜单).ContextMenu(上下文菜单).SubMenu(子菜单). 1.OptionsMenu 按Menu键就会显示,用于 ...

  3. Android中创建option menu

    1.首先在res目录下新建一个menu文件夹,右击res目录->New->Directory,输入文件夹名menu,点击OK. 接着在这个文件夹下再新建一个名叫main的菜单文件,右击me ...

  4. Android studio 中R.menu的创建

    对于Android开发中的menu没有声明的情况: 首先,将鼠标定位到红色的menu上面, 然后,Alt+enter组合键,建立文件menu, 然后将以下代码复制进去: <item androi ...

  5. Android通过XML来定义Menu

    直接在代码中添加菜单项,给菜单项分组等,这是比较传统的做法,它存在着一些不足.比如说,为了响应每个菜单项,我们需要用常量来保存每个菜单项的ID等.为此,Android提供了一种更好的方式,就是把men ...

  6. android中的菜单Menu

    Menu是一个接口, 他有2个子接口, SubMenu和ContextMenu; 前者菜单常见于按home键就会出现 ,后者是一个上下文菜单, 一般点击某个条目会在手机屏幕中出现一个类似悬浮窗口的菜单 ...

  7. Android学习笔记之Menu的ShowAsAction属性的设置

    (1)在res--menu目录下的main.xml文件 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 2 ...

  8. android学习——Android Studio下创建menu布局文件

    一.问题: android studio项目中没有看到menu文件夹: 在android studio项目中想要添加menu布局文件,一开始我的做法是:直接在res文件夹右键选择xml文件来添加,如下 ...

  9. android小结

    一. 对与java读写文件的操作: 字节流: //filename  可以是文件名,可以是文件路径 FileOutputStream outputStream=new FileOutputStream ...

随机推荐

  1. eclipse中新建maven项目

    maven是个项目管理工具,集各种功能于一身,下面介绍maven web项目在eclipse种的配置,并于tomcat集成.配置成功后,可以跟一般的web项目一样调试. 一.准备条件 1.安装下载jd ...

  2. Android(java)学习笔记252:ContentProvider使用之内容观察者01

    1. 内容观察者 不属于四大组件,只是内容提供者ContentProvider对应的小功能. 如果发现数据库内容变化了,就会立刻观察到. 下面是逻辑图:       当A应用中银行内部的数据发生变化的 ...

  3. Android系统更改状态栏字体颜色

    随着时代的发展,Android的状态栏都不是乌黑一片了,在Android4.4之后我们可以修改状态栏的颜色或者让我们自己的View延伸到状态栏下面.我们可以进行更多的定制化了,然而有的时候我们使用的是 ...

  4. MultiWii MWC的软件和调试方法

    (如果你的电脑是win7 64位的系统,安装了JAVA虚拟机后GUI仍然运行不了,那你就需要到C:\Program Files\Java\jre7\bin\找到并复制javaw.exe,然后粘贴到C: ...

  5. ListIterator add remove 使用注意

    add方法示例 //在最前面添加 List<String> list1 = new LinkedList<String>(Arrays.asList(new String[]  ...

  6. SpringMVC01

    1.创建一个web项目  引入所需要的jar 2.在web.xml文件中配置 核心控制器 <?xml version="1.0" encoding="UTF-8&q ...

  7. python的行与缩进

    #coding=utf-8#逻辑行与物理行#以下是3个物理行print "abc"print "789"print "777" #以下是1个 ...

  8. sunny day

    初始学习记录 基于http://www.htmleaf.com/html5/html5muban/20141121552.html模板 <!DOCTYPE html> <html l ...

  9. Design Pattern —— Prototype /Template Method/Iterator/Composite/Bridge

    Prototype /Template Method/Iterator/Composite/Bridge 为什么把这五种设计模式放一起呢,没什么太高大上的原因,就是因为这五种模式JAVA开发最基本的特 ...

  10. 【译】addEventListener 第二个参数

    这是原文链接:Our Backwards DOM Event Libraries 浏览器APIs 先简单回顾一下各个浏览器提供了哪些绑定事件的接口. IE浏览器提供了element.attachEve ...