Android的菜单分为三种类型:选项菜单(Option Menu)、上下文菜单(Context Menu)、子菜单(Sub Menu)

一.选项菜单


当用户单击设备上的菜单按钮(Menu),触发事件弹出的菜单就是选项菜单。选项菜单最多只有六个,超过六个第六个就会自动显示 更多 选项来展示显示。

创建方法:

1、覆盖Activity的onCreateOptionsMenu(Menu menu)方法,当我们第一次打开菜单时调用。

2、调用Menu的add()方法添加菜单项(MenuItem),可以调用MenuItem的setIcon()方法为菜单项设置图标。

3、当菜单项(MenuItem)被选中时,覆盖Acitivy的onOptionsMenuSelected()方法响应事件。


@Override
publicboolean onCreateOptionsMenu(Menu menu) {
    // 调用父类方法来加入系统菜单
    // 虽然目前android还没有系统菜单,但是为了兼容到以后的版本,最好加上
super.onCreateOptionsMenu(menu);
   
    // 添加菜单项(多种方式)
    // 1.直接指定标题
    menu.add("菜单项1");
    // 2.通过资源指定标题
    menu.add(R.string.menuitem2);
    // 3.显示指定菜单项的组号、ID、排序号、标题
    menu.add(
            1,            //组号
            Menu.FIRST, //唯一的ID号
            Menu.FIRST, //排序号
"菜单项3"); //标题
   
    // 如果希望显示菜单,请返回true
returntrue;
}
/*
@Override
publicboolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);
    // 添加4个菜单项,分成2组
int group1 =1;
    int gourp2 =2;
    menu.add(group1, 1, 1, "item 1");
    menu.add(group1, 2, 2, "item 2");
    menu.add(gourp2, 3, 3, "item 3");
    menu.add(gourp2, 4, 4, "item 4");
    // 显示菜单
    menu.removeGroup(group1);    //删除一组菜单
    menu.setGroupVisible(gourp2, visible);    //设置一组菜单是否可见
    menu.setGroupEnabled(gourp2, enabled);    //设置一组菜单是否可点
    menu.setGroupCheckable(gourp2, checkable, exclusive);    //设置一组菜单的勾选情况


returntrue;
}*/

二、上下文菜单


    当用户长按Activity页面时,弹出的菜单我们称为上下文菜单。我们经常在Windows中用鼠标右键单击弹出的菜单就是上下文菜单。

1、覆盖Activity的onCreateContextMenu()方法,调用Menu的add方法添加菜单项MenuItem

2、覆盖onContextItemSelected()方法,响应菜单单击事件

3、调用registerForContextMenu()方法,为视图注册上下文菜单


@Override
	public void onCreateContextMenu(ContextMenu menu, View v,
			ContextMenuInfo menuInfo) {
		// TODO Auto-generated method stub
		
		menu.add("HI");
		menu.add("china");
		
		//子菜单
		SubMenu file = menu.addSubMenu("english");
		SubMenu file2 = menu.addSubMenu(1,111,1,"math");
		
		file.add(1, 11, 1, "nimei");
		file.add(1, 22, 2, "lilei");
		file.add(1, 33, 3, "hanmeimei");
		


		super.onCreateContextMenu(menu, v, menuInfo);
	}

三、子菜单


     子菜单就是将相同功能的分组进行多级显示的一种菜单,比如,Windows的“文件”菜单中就有“新建”,“打开”,“关闭”等子菜单。

     创建子菜单的方法

    1、覆盖Activity的onCreateOptionsMenu()方法,调用Menu的addSubMenu()方法添加子菜单项

    2、调用SubMenu的add()饭饭,添加子菜单项

    3、覆盖onCreateItemSelected()方法,响应菜单单击事件。


@Override
publicboolean onCreateOptionsMenu(Menu menu) {
    int base = Menu.FIRST;
    // 一个menu可以包括多个子菜单
    SubMenu subMenu = menu.addSubMenu(base, base+1, Menu.NONE, "系统设置");
    // 子菜单可以包括多个菜单项
    MenuItem menuitem1 = subMenu.add(base, base+1, base+1, "显示设置");
    subMenu.add(base, base+2, base+2, "网络设置");
    subMenu.add(base, base+3, base+3, "高级设置");
    subMenu.add(base, base+4, base+4, "安全设置");
    
    // 子菜单项不支持显示图标,这样做是没意义的,尽管不会报错!
    menuitem1.setIcon(R.drawable.displaysettings);
    
    //但是子菜单本身是支持图标的
    subMenu.setIcon(R.drawable.settings);
    
    // 显示菜单请返回true
returntrue;
}

关于几种菜单的消息处理:

1、选项菜单

@Override
publicboolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    //响应每个菜单项(通过菜单项的ID),父菜单项和子菜单项的消息处理也是通过id号来区分
case1:
        // do something here
break;
    case2:
        // do something here
break;
    case3:
        // do something here
break;
    case4:
        // do something here
break;
    default:
        //对没有处理的事件,交给父类来处理
returnsuper.onOptionsItemSelected(item);
    }
    //返回true表示处理完菜单项的事件,不需要将该事件继续传播下去了
return true;
}

2、上下文菜单

@Override
	public boolean onContextItemSelected(MenuItem item) {
		// TODO Auto-generated method stub
		
		switch (item.getItemId()) { //通过id区分点击事件,父菜单项和子菜单项都可以处理
		case 11:
			new AlertDialog.Builder(this).setTitle("11").setMessage("11 hope")
			.setPositiveButton("确定", null).show();
			break;


		case 22:
			new AlertDialog.Builder(this).setTitle("22").setMessage("22 hope")//子菜单项
			.setPositiveButton("确定", null).show();
			break;


		case 111:
			new AlertDialog.Builder(this).setTitle("111").setMessage("22 hope") //父菜单项
			.setPositiveButton("确定", null).show();
			break;


		default:
			break;
		}
		return super.onContextItemSelected(item);
	}

3、子菜单


处理方式参见上面介绍




另外可以使用其他方式来进行菜单处理:


1、使用监听器

虽然第一种方法是推荐使用的方法,android还是提供了类似java swing的监听器方式来响应菜单。使用监听器的方式分为两步:


//第一步:创建监听器类
class MyMenuItemClickListener implements OnMenuItemClickListener {
    @Override
    publicboolean onMenuItemClick(MenuItem item) {
        // do something here...
	return true;    //finish handling
    }
}


//第二步:为菜单项注册监听器
menuItem.setOnMenuItemClickListener(new MyMenuItemClickListener());

2、使用Intent相应菜单


直接在MenuItem上调用setIntent(Intent intent)方法,这样android会自动在该菜单被点击时调用 startActivity(Intent)。但是与其这样还不如直接在onOptionsItemSelected的case里手动调用 startActivity(Intent)来的直观。