Adroid 下菜单的使用

本文深入解析Android菜单的三种类型:选项菜单、上下文菜单与子菜单的创建与消息处理方法,包括如何在选项菜单中添加、删除和设置菜单项,如何响应选项菜单项的点击事件;在上下文菜单中添加、删除和设置菜单项,以及如何响应上下文菜单项的点击事件;如何创建和操作子菜单,以及如何在子菜单中添加子菜单项,并处理子菜单项的点击事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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)来的直观。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值