android 之 菜单
android的菜单主要分三类:选项菜单(Options Menu)、上下文菜单(Context Menu)、子菜单(Submenu)。
1 选项菜单和子菜单
一个Menu对象代表一个菜单,Menu中可添加菜单项MenuItem,也可以添加子菜单SubMenu。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}@Override
public boolean onCreateOptionsMenu(Menu menu) {
// TODO Auto-generated method stub
//添加性别子菜单
SubMenu subMenuGender=menu.addSubMenu(MAIN_GROUP, MENU_GENDER, 0,"性别");
subMenuGender.setIcon(R.drawable.gender);
subMenuGender.setHeaderIcon(R.drawable.gender);
male=subMenuGender.add(GENDER_GROUP,MENU_GENDER_MALE, 0, "男");//为子菜单添加选项
male.setChecked(true);//设置默认选项
subMenuGender.add(GENDER_GROUP,MENU_GENDER_FEMALE, 0, "女");//为子菜单添加选项
subMenuGender.setGroupCheckable(GENDER_GROUP, true, true);//设置GENDER_GROUP组是可选的、互斥的
//添加兴趣子菜单
SubMenu subMenuHobby=menu.addSubMenu(MAIN_GROUP, MENU_HOBBY, 1, "爱好");
subMenuHobby.setIcon(R.drawable.hobby);
miaHobby[0]=subMenuHobby.add(HOBBY_GROUP, MENU_HOBBY1, 0, "游泳");
miaHobby[1]=subMenuHobby.add(HOBBY_GROUP, MENU_HOBBY2, 1, "篮球");
miaHobby[2]=subMenuHobby.add(HOBBY_GROUP, MENU_HOBBY3, 2, "跑步");
miaHobby[0].setCheckable(true);
miaHobby[1].setCheckable(true);
miaHobby[2].setCheckable(true);//设置为可多选
MenuItem ok=menu.add(MAIN_GROUP, MENU_OK, 3, "确定");//为主菜单添加选项菜单
OnMenuItemClickListener lsn=new OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
// TODO Auto-generated method stub
appendStateStr();
return true;
}
};
ok.setOnMenuItemClickListener(lsn);
ok.setAlphabeticShortcut('o');//给确定菜单设置字符快捷键
return true;
}@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
switch(item.getItemId()){
case MENU_GENDER_MALE:
case MENU_GENDER_FEMALE:
item.setChecked(true);
appendStateStr();
break;
case MENU_HOBBY1:
case MENU_HOBBY2:
case MENU_HOBBY3:
item.setChecked(!item.isChecked());
appendStateStr();
break;
}
return true;
}private void appendStateStr() {
// TODO Auto-generated method stub
String result="您选择的性别是:";
if(male.isChecked()){
result+="男";
}else{
result+="女";
}
String hobbyStr="";
for(MenuItem mi:miaHobby){
if(mi.isChecked()){
hobbyStr+=mi.getTitle()+"、";
}
}
if(hobbyStr.length()>0){
result+=",您的爱好为:"+hobbyStr.substring(0,hobbyStr.length()-1)+".\n";
}else{
result=result+".\n";
}
Toast.makeText(mainActivity.this, result, Toast.LENGTH_LONG).show();
}
2 上下文菜单
上下文菜单是注册到某个View对象上的,如果一个View对象注册了上下文菜单,用户可通过长按该View对象弹出上下文菜单.
首先在onCreateContextMenu中为不同空间配置不同的上下文菜单:
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
// TODO Auto-generated method stub
super.onCreateContextMenu(menu, v, menuInfo);
menu.setHeaderIcon(R.drawable.bird);
if(v==findViewById(R.id.editview01)){
menu.add(0,1,0,"菜单项1");
menu.add(0,2,0,"菜单项2");
menu.add(0,3,0,"菜单项3");
}else if(v==findViewById(R.id.editview02)){
menu.add(0,4,0,"菜单项4");
menu.add(0,5,0,"菜单项5");
}
}
在onCreate方法中为两个文本框注册上下文菜单:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
this.registerForContextMenu(findViewById(R.id.editview01));
this.registerForContextMenu(findViewById(R.id.editview02));
}
添加上下文菜单监听事件:
@Override
public boolean onContextItemSelected(MenuItem item) {
// TODO Auto-generated method stub
switch(item.getItemId()){
case 1:
case 2:
case 3:
Toast.makeText(mainActivity.this, "这是第一个EditView的上下文菜单"+item.getTitle(), Toast.LENGTH_LONG).show();
case 4:
case 5:
Toast.makeText(mainActivity.this, "这是第二个EditView的上下文菜单"+item.getTitle(), Toast.LENGTH_LONG).show();
}
return super.onContextItemSelected(item);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端