一、 使用xml定义Menu
菜单资源文件必须放在res/menu文件夹中。菜单资源文件必须使用<menu>标签作为根节点。除了<menu>标签外,还有另外两个标签用于设置菜单项和分组,这两个标签是<item>和<group>。
<menu>标签没有不论什么属性,但能够嵌套在<item>标签中,表示子菜单的形式。只是<item>标签中不能再嵌入<item>标签。
1.<item>标签的属性含义例如以下:
Id:表示菜单项的资源ID
menuCategory:同种菜单项的种类。该属性可取4个值:container、system、secondary和alternative。通过menuCategroy属性能够控制菜单项的位置。比如将属性设为system,表示该菜单项是系统菜单,应放在其它种类菜单项的后面。
orderInCategor:同种类菜单的排列顺序。该属性须要设置一个整数值。比如menuCategory属性值都为system的3个菜单项(item1、item2和item3)。将这3个菜单项的orderInCategory属性值设为3、2、1,那么item3会显示在最前面,而item1会显示在最后面。
title:菜单项标题(菜单项显示的文本)
titleCondensed:菜单项的短标题。当菜单项标题太长时会显示该属性值
icon:菜单项图标资源ID
alphabeticShortcut:菜单项的字母快捷键
numericShortcut:菜单项的数字快捷键
checkable:表示菜单项是否带复选框。该属性可设计为true或false
checked:假设菜单项带复选框(checkable属性为true),该属性表示复选框默认状态是否被选中。可设置的值为true或false
visible:菜单项默认状态是否可视
enable:菜单项默认状态是否被激活
2.<group>标签的属性含义例如以下:
id:表示菜单组的ID
menuCategory:与<item>标签的同名属性含义同样。仅仅是作用域为菜单组
orderInCategory:与<item>标签的同名属性含义同样。仅仅是作用域为菜单组
checkableBehavior:设置该组全部菜单项上显示的选择组件(CheckBox或Radio Button)。假设将该属性值设为all,显示CheckBox组件;假设设为single,显示Radio Button组件;假设设为none,显示正常的菜单项(不显示不论什么选择组件)。要注意的是,Android SDK官方文档在解释该属性时有一个笔误,原文是:
Whether the items are checkable. Valid values: none, all(exclusive/radiobuttons), single(non-exclusive/checkboxes).
相反了,正确应该是
all(non-exclusive/checkboxes),single(exclusive/radiobuttons).
visible:表示当前组中全部菜单项是否显示。该属性可设置的值是true或false
enable:表示当前组中全部菜单项是否被激活。该属性可设置的值是true或false
3.详细使用
在代码中使用
public boolenonCreateOptionsMenu(Menu menu){
MenuInflatemenuInflate = getMenuInflate();
menuInflate.inflate(R.menu.option_menu,menu);
returntrue;
}
二、使用代码定义Menu
public boolean onCreateOptionsMenu(Menu menu){
// 方法一,用代码构建
menu.add(Menu.NONE, Menu.NONE, 1, "菜单1");
menu.add(Menu.NONE, Menu.NONE, 2, "菜单2");
menu.add(Menu.NONE, Menu.NONE, 3, "菜单3");
menu.add(Menu.NONE, Menu.NONE, 4, "菜单4");
menu.add(Menu.NONE, Menu.NONE, 5, "菜单5");
menu.add(Menu.NONE, Menu.NONE, 6, "菜单6");
return true;
}
三、菜单响应
重写onOptionsItemSelected(MenuItem item)这种方法就能够做响应的操作了。
四、实例
res/menu下的activity_main.xml文件
<menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/menu_settings" android:orderInCategory="1" android:icon="@drawable/home" android:title="@string/menu_settings"/> <item android:id="@+id/menu_about" android:orderInCategory="2" android:icon="@drawable/mine" android:title="@string/menu_about"/> <item android:id="@+id/menu_quit" android:orderInCategory="3" android:icon="@drawable/more" android:title="@string/menu_quit"/> </menu>
MainActivity.java文件
package com.example.menutest; import android.os.Bundle; import android.app.Activity; 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.activity_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // TODO Auto-generated method stub switch(item.getItemId()){ case R.id.menu_about: Toast.makeText(MainActivity.this, ""+"关于", Toast.LENGTH_SHORT).show(); break; case R.id.menu_settings: Toast.makeText(MainActivity.this, ""+"设置", Toast.LENGTH_SHORT).show(); break; case R.id.menu_quit: Toast.makeText(MainActivity.this, ""+"退出", Toast.LENGTH_SHORT).show(); break; default: break; } // Toast.makeText(MainActivity.this, ""+item.getItemId(), Toast.LENGTH_SHORT).show(); return super.onOptionsItemSelected(item); } }
执行结果: