这一讲开始我们来讲一下Android中菜单的使用方法,菜单是应用中的普通的组件,主要是提供友好和专注的用户体验,你可以在你的Activity中使用 Menu APIs 来提供用户动作和其他选项的操作。
    从Android 3.0 开始,Android 设备就不再提供一个专用的菜单按钮,而是依赖与独立的 6个选项的菜单面板,而且提供了 Action Bar来显示用户的行为。所以在高版本中,菜单的应用将会比较小了。

1.  三种菜单显示的方式

1). Options menu and action bar
2). Context menu and contextual action mode
3). Popup menu

2. 今天我们来介绍一下 Menu 的第一种的使用方式:Options menu and action bar [action bar 这里先不做介绍,后期会详细专题讲解]

1) Options menu介绍

Options menu 是一个Activity中的菜单选项的主要组成部分,它是作用在全局的app中的,比如说 "Search","Compose email","Settings."

   在Android 2.3 版本以下或者更低版本中,用户可以通过点击菜单按钮来弹出菜单选项面板
   在Android 3.0 高级别的版本中,这种选项菜单已经被 Action Bar 这种直接在屏幕中操作选项或者弹出选项的组件所替代了。从Android 3.0 开始,菜单按钮是不赞成使用了(很多设备已经没有了菜单的按钮) ,所以你应该转移到 ActionBar 提供给用户操作其它选项的动作。
   详情参考:Creating an Options Menu 

2) Options menu 定义方式

   创建 Options menu 这个菜单有两种使用方式,一种是在代码中直接创建,主要是使用add()方法的方式,查看Menu API 文档中的add()方法

public abstract MenuItem add (int groupId, int itemId, int order, CharSequence title)

groudId:是指组ID,用以批量地对菜单子项进行处理和排序
   itemId:是子项ID,是每一个菜单子项的唯一标识
   order:指定菜单子项在选项菜单中的排列顺序
   titler: 菜单标题

   另外一种是在 XML 中定义一个菜单,引用代码如下
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater =
getMenuInflater()
;
inflater.inflate(R.menu.game_menu, menu);
return true;
}

3) 触发事件

触发点击事件,当用户选择从菜单选项中选择一项的时候(包括 ActionBar中的action items) ,系统会调用你Activity的onOptionsItemSelected()方法,这个方法会根据MenuItems来选择,你可以调用getItemId()来确定选项的ID,这个ID值就是你在菜单资源中定义的id属性值或者你通过add()方法给出的一个整型值。

查看API文档中 Menu 的介绍
    By default, every Activity supports an options menu of actions or options. You can add items to this menu and handle clicks on your additions. The easiest way of adding menu items is inflating an XML file into the Menu via MenuInflater. The easiest way of attaching code to clicks is via onOptionsItemSelected(MenuItem) and onContextItemSelected(MenuItem).

4) 在代码中创建 Option menu 菜单的实现

1) 布局文件 activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" > </RelativeLayout>

2) 主要代码 MainActivity.java

public class MainActivity extends Activity {

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
} // 创建菜单有两种使用方式,一种是 使用inflate 来加载XML,如以下注释中
// 第二种是使用 add()方法的方式来操作。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
// getMenuInflater().inflate(R.menu.main, menu); 第一种使用方式
// 设置菜单选项一般最好设置低于 6个选项
MenuItem menuItem = menu.add(1001, 100, 1, "菜单一");
// menuItem.setIcon(R.drawable.ic_launcher); //高版本中不建议添加图标。添加了图标也不会显示的。
MenuItem menuItem2 = menu.add(1001, 101, 2, "菜单二");
MenuItem menuItem3 = menu.add(1001, 102, 3, "菜单三");
menuItem3.setShortcut('c', 'c'); // 设置菜单快捷键
return true;
} // 触发菜单的点击事件
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case 100:
Toast.makeText(MainActivity.this, "点击菜单一选项", 3).show();
break;
case 101:
// 菜单选项一般都用户跳转到其他Activity的操作,使用
// setIntent()方法,当然也可以通过Intent来传递一些信息。
Intent intent = new Intent(MainActivity.this, NextActivity.class);
item.setIntent(intent);
break;
case 102:
break;
default:
break;
}
return super.onOptionsItemSelected(item);
} } 

3) 跳转到的另外一个Activity的布局文件 next_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <ProgressBar
android:id="@+id/progressBar1"
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content" /> </LinearLayout>

4) 跳转到的另外一个Activity代码 NextActivity.java

package com.android.menudemo;

import android.app.Activity;
import android.os.Bundle; public class NextActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.next_activity);
}
}

5) 程序执行结果

5. 在 XML 中定义一个 Option Menu

    下面我们来学一下第二种定义菜单的方式,使用XML来定义菜单,对于所有的菜单类型,Android 提供了一种标准的 XML 格式来定义菜单选项来替换在Activity中编写菜单的方式,你可以定义一个菜单和它所有的选项在XML菜单资源中,你可以通过 inflate 菜单资源(将其加载为一个Menu对象) 在你的activity 或者 fragment中。

1) 使用这种方式有几个好处:
    1. 定义在xml中比较容易的显示出菜单的结构
    2. 可以将菜单的内容与应用程序代码进行独立
    3. 在不同的平台版本,屏幕尺寸和其他配置中,可以通过应用资源框架来允许你建立灵活的菜单配置

2) 定义菜单的位置:
    定义好菜单选项,建立一个xml文件在你工程目录:res/menu/ 中,同时建立其组成菜单的以下标签元素。
    <menu>
      定义好一个 Menu,它是菜单选项的内容包含者,<menu> 标签元素必须是这个文件的根节点,而且支持一个或者多个的<item>和<group>元素。
    <item>
      创建一个 MenuItem,它是菜单里面的一个单一的选项,这个元素可以包含一个嵌套的 <menu> 元素来创建一个子菜单。  

      <item> 元素包含的属性有
        android:id
        android:icon
        android:title
        android:showAsAction

android:showAsAction [这个属性比较重要的:它是作为aciton bar中的活动选项,可以指定何时或者如何显示] = "never" 表示不会在 ActionBar的标题栏中去显示了,查看API文档: Menu Resource 的android:showAsAction 各种属性,下面就写两个,其他读者自己去参考。

ifRoom: 可以将这个选项放置在导航栏中,如果它有空间的话。
withText: 可以在导航栏中设置标题,这个标题就是通过 android:title 定义的

android:orderInCategory 表明摆放的顺序,不一定从0还是计算,但必须大于等于0,建议从0,1,2,3....这样依次给出,并且与XML行文的顺序一致。

<group>
      这是可选的标签,它可以让你将菜单选项分类,这样他们就能分享一些配置,比如活动状态和显示隐藏状态等。更多信息查看 Creating Menu Groups.

6. 主要代码实现

1) 菜单文件 menu.xml 在目录 res/menu/ 中。

<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
android:id="@+id/action_settings"
android:icon="@drawable/two"
android:orderInCategory="100"
android:showAsAction="ifRoom|withText"
android:title="@string/action_settings">
<menu>
<item
android:id="@+id/create_new"
android:title="新建文件"/>
<item
android:id="@+id/open"
android:title="打开文件"/>
</menu>
</item>
<item
android:id="@+id/sys"
android:icon="@drawable/two"
android:orderInCategory="101"
android:showAsAction="never"
android:title="用户菜单">
<menu>
<group android:id="@+id/group1" >
<item
android:id="@+id/load"
android:title="加载文件">
</item>
</group>
<group android:id="@+id/group1" >
<item
android:id="@+id/save"
android:title="保存文件">
</item>
</group>
</menu>
</item> </menu>

2) 主要代码 MainActivity.java

package com.android.menudemo;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast; 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) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} @Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
switch (item.getItemId()) {
case R.id.create_new:
Intent intent = new Intent(MainActivity.this, NextActivity.class);
item.setIntent(intent);
break;
case R.id.open:
Toast.makeText(MainActivity.this, "打开文件", 3).show();
break;
case R.id.load:
Toast.makeText(MainActivity.this, "加载文件", 3).show();
break;
case R.id.save:
Toast.makeText(MainActivity.this, "保存文件", 3).show();
break;
default:
break;
}
return super.onMenuItemSelected(featureId, item);
} }

7. 程序执行结果

详细参考:http://developer.android.com/guide/topics/ui/menus.html

本文转自:http://blog.csdn.net/xukunhui2/article/details/9972387

Android4.0 -- UI控件之 Menu 菜单的的使用(一)的更多相关文章

  1. Android4.0 -- UI控件之 Menu 菜单的的使用(三)

    上一讲 [Android 开发]:UI控件之 Menu 菜单的的使用(二) 我们讲解了创建上下文菜单的第一种使用方式:Creating a floating context menu [创建悬浮的上下 ...

  2. Android4.0 -- UI控件之 Menu 菜单的的使用(二)

    上一讲我们讲解了android中在代码或者xml文件中定义菜单,这一讲我们继续来讲解一下定义菜单的其他方式:创建上下文的菜单.查看API文档 Menus :Creating Contextual Me ...

  3. Android4.0 -- UI控件之 Menu 菜单的的使用(四)

    2.  PopupMenu 菜单的使用 1) PopupMenu 介绍   创建弹出菜单,它一般会在view的上边或者下边弹出菜单[具体看是否有空间],注意弹出菜单是api在11或者更高版本中使用   ...

  4. 一个Activity掌握Android4.0新控件 (转)

    原文地址:http://blog.csdn.net/lavor_zl/article/details/51261380 谷歌在推出Android4.0的同时推出了一些新控件,Android4.0中最常 ...

  5. Atitit.ui控件---下拉菜单选择控件的实现select html

    Atitit.ui控件---下拉菜单选择控件的实现select   html 1. 调用& model的实现 1 2. -----select.jsp------ 1 1. 调用& m ...

  6. Android4.0新控件

    谷歌在推出Android4.0的同时推出了一些新控件,Android4.0中最常用的新控件有下面5种.  1. Switch的使用 Switch顾名思义,就是开关的意思,有开和关两种状态. 当Swit ...

  7. Android 控件 之 Menu 菜单

    http://www.cnblogs.com/Mrs-cc/archive/2012/07/21/2603042.html 1.OptionsMenu (选项菜单)用法总结   使用方法: 方法一:添 ...

  8. Cocos2d-x3.0游戏实例之《别救我》第六篇——从代码中获取UI控件

    这篇的内容非常easy,获取UI控件,然后使用它. 还记得我们在UI编辑器中给三个button分别命名了吧? 如今要用上了. 笨木头花心贡献,啥?花心?不呢,是用心~ 转载请注明,原文地址: http ...

  9. Cocos2d-x3.0 从代码中获取cocostudio编辑的UI控件

    依据名字查找控件 须要包括的头文件及名字空间: #include "cocostudio/CocoStudio.h" #include "ui/CocosGUI.h&qu ...

随机推荐

  1. mongodb write 【摘自网上,只为记录,学习】

    mongodb有一个write concern的设置,作用是保障write operation的可靠性.一般是在client driver里设置的,和db.getLastError()方法关系很大 一 ...

  2. JavaScript 学习笔记-- ES6学习(一)介绍以及Babel的使用

    本文摘自阮一峰老师的<ECMAScript 6入门>,原文地址:http://es6.ruanyifeng.com/#docs/intro ECMAScript 6 是一个泛指,含义是5. ...

  3. JDBC实现往MySQL插入百万级数据

    想往某个表中插入几百万条数据做下测试, 原先的想法,直接写个循环10W次随便插入点数据试试吧,好吧,我真的很天真.... DROP PROCEDURE IF EXISTS proc_initData; ...

  4. ECMA中关于if与else的关系的一句英文,感觉比较经典

    Each else for which the choice of assocated if is ambiguous shall be associated with the nearest pos ...

  5. dom例子

    //凡是html标签中的属性和值是一样的,那么在js中用true或者false 1,阅读协议倒计时 <input type="button" name="name& ...

  6. CSS禁止Chrome谷歌浏览器激活输入框后自动添加橘黄色边框

    Chrome默认会为所有的输入框加上橘黄色的边框,虽然有时候可以使我们的网站看起来更友好,但对自定义的样式是有影响的.当鼠标点击输入框时,在谷歌chrome浏览器中,光标移到输入框时激活输入框会被加上 ...

  7. express cookie-session解惑

    express的中间件基于connect模块而来,所以相关文档可以直接参考 http://www.senchalabs.org/connect/ 使用cookie-session中间件过程中,比较困惑 ...

  8. bss段为什么需要初始化?

    我们都知道bss段需要初始化,但是这是为什么呢? 通过浏览资料,我们都会发现,bss段是不会出现在程序下载文件(*.bin *.hex)中的,因为全都是0.如果把它们出现在程序下载文件中,会增加程序下 ...

  9. 一些嵌入式和FPGA相关模块的开源

    工作一年,整理下手头做过的东西,分享出来,希望能帮到大家. 嵌入式方面,主要集中在Xilinx家的器件上,ZYNQ居多.Linux相关的就不贴了,网上的资料太多,xilinx-wiki上资料都是比较全 ...

  10. Cocoa Touch 框架

    Cocoa Touch包括: (1)Core Animation: 通过Core Animation,可以通过一个基于独立图层的简单的编程模型来创建丰富的用户体验. (2)Core Audio: Co ...