原标题:Android系列之UI组件——Menu菜单
从官方文档了解到,从Android3.0(API level 11)开始,Android设备不再要求提供一个专门的菜单按钮,转而推荐使用ActionBar.所以现在市面上很多新设备使用三个虚拟按键,并不再额外提供菜单按钮。
因为Android版本的发展,对于菜单的支持各个版本有很大的区别,而Android3.0是个分水岭,大概可以分为下面三类:
OptionMenu和ActionBar:一些操作的集合,如果开发的平台在Android3.0之上,推荐使用ActionBar,如果开发的平台在Android2.3或之下,还是可以使用OptionMenu的。
ContextMenu和ActionMode:ContextMenu是一个浮动的窗口形式展现一个选项列表,ActionMode是一个显示在屏幕顶部的操作栏,允许用户选择多个选项,ActionMode在Android3.0之后才有支持。
Popup Menu:PopupMenu是固定在View上的模态菜单,以弹出的方式显示,在Android3.0之后才有支持。
【在XML中定义一个菜单】
Android提供了标准的XML格式的资源文件来定义菜单项,并且对所有菜单类型都支持,推荐使用XML资源文件来定义菜单,之后再把它Inflater到Activity或者Fragment中,而不是在Activity中使用代码声明。
而菜单的XML资源文件,需要创建在/res/menu/目录下,并且包含一下几个元素:
:定义一个Menu,是一个菜单资源文件的根节点,里面可以包含一个或者多个和元素。
:创建一个MenuItem,代表了菜单中一个选项。
:对菜单项进行分组,可以以组的形式操作菜单项。
元素除了常规的id、icon、title属性的支持,还有一个重要的属性:android:showAsAction,这个属性是起兼容性的,描述了在Android的高版本中,菜单项何时以何种方式加入到ActionBar中。
是对菜单进行分组,分组后的菜单显示效果并没有区别,唯一的区别在于可以针对菜单组进行操作,这样对于分类的菜单项,操作起来更方便,提供如下的操作:
Menu.setGroupCheckable()菜单组内的菜单是否都可选。
Menu.setGroupVisible()是否隐藏菜单组的所有菜单。
Menu.setGroupEnabled()菜单组的菜单是否有用。
如果菜单项需要单选或者多选,可以使用android:checkableBehavior属性设置,它可以对单个或者设置一个组,这个属性接受三个参数:single,单选;all,多选,none,没有Checked的选项,默认。
当创建好一个XML菜单资源文件之后,可以使用MenuInflater.inflate()方法填充菜单资源,使XML资源变成一个可编程的对象。
一、Options menu选项菜单:
OptionMenu,选项菜单,单击手机上的菜单键(MENU)出现,必须设备具有菜单按钮才可以触发。因为屏幕的限制,最多只能展示六个菜单项,如果定义的菜单项超出了六个,其他的菜单项将被隐藏,第六个菜单将会显示“更多”,点击展开更多的菜单。虽说在Android3.0之后不再推荐使用选项菜单,但是如果使用了,在Android3.0之后的设备上,选项菜单项将被默认转移到ActionBar中,这个可以通过android:showAsAction属性控制。
创建选项菜单的核心步骤:
(1)重写Activity的onCreateOptionMenu(Menu menu)方法,当菜单第一次被加载时调用
(2)调用Menu 的add( )方法添加菜单项(MenuItem),同时可以调用MenuItem的setIcon()方法为菜单项设置图标(注:Android 3.0之后,即使添加了图标也不会显示)
(3)重写Activity的OptionsItemSelected(MenuItem item)来响应菜单项(MenuItem)的点击事件
来看一下具体的代码实现:
新建Android工程MenuTest:
二、通过配置文件添加Menu选项
(1)在res/menu/main.xml中定义菜单项。main.xml的代码如下:
复制代码
xmlns:tools=“http://schemas.android.com/tools”
tools:context=“com.example.menutest.MainActivity” >
android:id=“@+id/start”
android:orderInCategory=“100”
android:showAsAction=“never”
android:title=“@string/start”/>
android:id=“@+id/over”
android:orderInCategory=“200”
android:showAsAction=“never”
android:title=“@string/over”/>
复制代码
注:第9行和第15行的字符串引用,需要提前在strings.xml文件中设置好。
(2)MainActivity.java:
代码
1 package com.example.menutest;
2
3 import android.app.Activity;
4 import android.os.Bundle;
5 import android.view.Menu;
6 import android.view.MenuItem;
7 import android.widget.Toast;
8
9
10 public class MainActivity extends Activity {
11
12 @Override
13 protected void onCreate(Bundle savedInstanceState) {
14 super.onCreate(savedInstanceState);
15 setContentView(R.layout.activity_main);
16 }
17
18
19 //重写onCreateOptionMenu(Menu menu)方法,当菜单第一次被加载时调用
20 @Override
21 public boolean onCreateOptionsMenu(Menu menu) {
22 // Inflate the menu; this adds items to the action bar if it is present.
23 //填充选项菜单(读取XML文件、解析、加载到Menu组件上)
24 getMenuInflater()inflate(R.menu.main, menu);
25 return true;
26 }
27
28 //重写OptionsItemSelected(MenuItem item)来响应菜单项(MenuItem)的点击事件(根据id来区分是哪个item)
29 @Override
30 public boolean onOptionsItemSelected(MenuItem item) {
31 // Handle action bar item clicks here. The action bar will
32 // automatically handle clicks on the Home/Up button, so long
33 // as you specify a parent activity in AndroidManifest.xml.
34 switch (item.getItemId()) {
35 case R.id.start:
36 Toast.makeText(this, “开始游戏”, Toast.LENGTH_SHORT)show();
37 break;
38 case R.id.over:
39 Toast.makeText(this, “结束游戏”, Toast.LENGTH_SHORT)show();
40 break;
41
42 default:
43 break;
44 }
45 return super.onOptionsItemSelected(item);
46 }
47 }
责任编辑: