Android系统里面有3种类型的菜单:options menu,context menu,sub menu。 options menu和context menu是并列关系,他们下面可以有子菜单sub menu,但sub menu下不能再有子菜单,所以Android最多只能有两级菜单。
options menu按Menu键就会显示,用于当前的Activity。
它包括两种菜单项:
因为options menu在屏幕底部最多只能显示6个菜单项,这些菜单项称为icon menu,icon menu只支持文字(title) 以及icon,可以设置快捷键,不支持checkbox以及radio控件,所以不能设置checkable选项。
而多于6的菜单项会以“more” icon menu来调出,称为expanded menu。它不支持icon,其他的特性都和icon menu一样。
在Activity里面,一般通过以下函数来使用options menu:
Activity::onCreateOptionsMenu (Menu menu) 创建options menu,这个函数只会在menu第一次显示时调用。
Activity::onPrepareOptionsMenu (Menu menu) 更新改变options menu的内容,这个函数会在menu每次显示时调用。
Activity::onOptionsItemSelected (MenuItem item) 处理选中的菜单项。
Java代码:
public class MainActivity extends Activity {
private EditText et;
static final private int MI1 = Menu.FIRST;
static final private int MI2 = Menu.FIRST + 1;
static final private int MI3 = Menu.FIRST + 2;
static final private int MI4 = Menu.FIRST + 3;
static final private int MI5 = Menu.FIRST + 4;
static final private int MI6 = Menu.FIRST + 5;
static final private int MI7 = Menu.FIRST + 6;
static final private int MI8 = Menu.FIRST + 7;
static final private int MI9 = Menu.FIRST + 8;
static final private int MI10 = Menu.FIRST + 9;
static final private int MI11 = Menu.FIRST + 10;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
et = (EditText) findViewById(R.id.tvSubMenu);
registerForContextMenu(et);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuItem item2 = menu.add(0, MI2, Menu.NONE, R.string.item2); // 第一个参数是组ID,第三个参数是菜单项的顺序位置
MenuItem item3 = menu.add(0, MI3, Menu.NONE, R.string.item3);
MenuItem item4 = menu.add(0, MI4, Menu.NONE, R.string.item4);
MenuItem item5 = menu.add(0, MI5, Menu.NONE, R.string.item5);
MenuItem item6 = menu.add(0, MI6, Menu.NONE, R.string.item6);
MenuItem item7 = menu.add(0, MI7, Menu.NONE, R.string.item7);
//设置简称
item4.setTitleCondensed("Short Title");
// 分配图标
item3.setIcon(R.drawable.add_new_item);
// 分配快捷方式
item3.setShortcut('0', 'a'); // 如果使用数字键盘就是0,如果使用全键盘就是a
//菜单单项单击监听器,但是不鼓励这样做,菜单项应被onOptionsItemSelected处理
item5.setOnMenuItemClickListener(new OnMenuItemClickListener(){
public boolean onMenuItemClick(MenuItem arg0) {
// TODO Auto-generated method stub
et.setText("Orisun");
return false;
}
});
//当单击一个事件菜单后,该事件既没有被MenuItemClickListener处理,也没有被OptionsItemSelected处理,就会触发分配给这个菜单项的Intent.
item6.setIntent(new Intent(this,SecActivity.class));
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
super.onOptionsItemSelected(item);
switch (item.getItemId()) {
case MI3:
Toast.makeText(getApplicationContext(),
"You choose Menu Item 3", Toast.LENGTH_SHORT).show();
default:break;
}
return false;
}
//每次显示菜单的时候会调用onPrepareOptionsMenu,根据程序的运行状态,可以对菜单进行动态的更改,可以动态地启用/禁用每一个菜单项
@Override
public boolean onPrepareOptionsMenu(Menu menu){
super.onPrepareOptionsMenu(menu);
if(et.getText().toString()!=""){
MenuItem menuItem=menu.findItem(MI3);
menuItem.setIcon(R.drawable.remove_item);
}
return true;
}
}
sub menu
不支持icon
Java代码:
//在options menu里面增加一个子菜单
//在options menu里面增加一个子菜单
public boolean onCreateOptionsMenu(Menu menu) {
SubMenu subMenu = menu.addSubMenu(0,0,Menu.NONE,"SubMenu");
subMenu.setHeaderIcon(R.drawable.icon);
subMenu.setIcon(R.drawable.icon);
//为子菜单添加一个菜单项
MenuItem summenuItem=subMenu.add(0,0,Menu.NONE,”Submenu Item”);
//.......
}
context menu 要在相应的view上按几秒后才显示的,用于view,跟某个具体的view绑定在一起。
这类型的菜单不支持icon和快捷键!
在Activity里面,一般通过以下函数来使用context menu:
Activity::registerForContextMenu(View view) 为某个view注册context menu,一般在Activity::onCreate里面调用。
Activity::onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) 创建context menu,和options menu不同,context meun每次显示时都会调用这个函数。
Activity::onContextItemSelected(MenuItem item) 处理选中的菜单项。
Java代码:
public void onCreate(Bundle savedInstanceState) {
//......
//为一个View注册一个上下文菜单
registerForContextMenu(et);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.add(1, MI8, Menu.NONE, "item 1").setCheckable(true)
.setChecked(false);
menu.add(1, MI11, Menu.NONE, "item 3").setCheckable(true)
.setChecked(true);
//注意MI8,MI11和MI9,MI10的groupID不一样了
int groupId = 0;
int menuItemOrder = Menu.NONE;
menu.add(groupId, MI9, menuItemOrder, "Item 1 in group");
menu.add(groupId, MI10, menuItemOrder, "Item 2 in group").setChecked(
true);
//函数原型setGroupCheckable(int group, boolean checkable,boolean exclusive)
menu.setGroupCheckable(groupId, true, true);// 这句话要写在groupitem的最后。
//为context menu添加子菜单
SubMenu subMenu2 = menu.addSubMenu("Sub Menu 1");
subMenu2.add("Sub Menu Item").setOnMenuItemClickListener(
new MenuItem.OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
Toast.makeText(getApplicationContext(),
"Sub Menu Item Selected", Toast.LENGTH_SHORT)
.show();
return false;
}
});
}
@Override
public boolean onContextItemSelected(MenuItem item) {
super.onContextItemSelected(item);
switch (item.getItemId()) {
case MI9:
Toast.makeText(getApplicationContext(),
"You choose Item 1 in group", Toast.LENGTH_SHORT).show();
default:break;
}
return false;
}
<? xml version="1.0" encoding="utf-8" ?>
< menu xmlns:android ="http://schemas.android.com/apk/res/android" >
< item android:id ="@+id/item1"
android:title ="item1"
android:icon ="@drawable/icon"
android:checkable ="true"
android:checked ="false" />
< group android:id ="@+id/group1"
android:checkableBehavior ="single" >
< item android:id ="@+id/group_item1"
android:title ="Item 1 in group" />
< item android:id ="@+id/group_item2"
android:title ="Item 2 in group"
android:checked ="true" />
</ group >
< item android:id ="@+id/submenu"
android:title ="Sub Menu" >
< menu >
< item android:id ="@+id/submenuitem"
android:title ="Sub Menu Item" />
</ menu >
</ item >
< item android:id ="@+id/item3"
android:title ="item3"
android:checkable ="true"
android:checked ="true" />
</ menu >
public class SecActivity extends Activity{
private EditText et;
@Override
public void onCreate(Bundle context){
super .onCreate(context);
setContentView(R.layout.sec);
et = (EditText)findViewById(R.id.tvSubMenu);
registerForContextMenu(et);
}
@Override
public void onCreateContextMenu(ContextMenu menu,View v,ContextMenuInfo menuInfo){
super .onCreateContextMenu(menu, v, menuInfo);
getMenuInflater().inflate(R.menu.contextmenu, menu);
}
}
长按EditText就会出现ContextMenu,点击Sub Menu就会出现右边这个图片。