1. 三种菜单显示的方式
1). Options menu and action bar2). Context menu and contextual action mode3). Popup menu
2. 今天我们来介绍一下 Menu 的第一种的使用方式:Options menu and action bar [action bar 这里先不做介绍,后期会详细专题讲解]
1) Options menu介绍
Options menu 是一个Activity中的菜单选项的主要组成部分,它是作用在全局的app中的,比如说 "Search","Compose email","Settings."
2) Options menu 定义方式
public abstract MenuItem add (int groupId, int itemId, int order, CharSequence title)
groudId:是指组ID,用以批量地对菜单子项进行处理和排序
itemId:是子项ID,是每一个菜单子项的唯一标识
order:指定菜单子项在选项菜单中的排列顺序
titler: 菜单标题
@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()方法给出的一个整型值。
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:showAsActionandroid: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