赵工的个人空间


专业技术部分转网页计算转业余爱好部分


 手持终端

首页 > 专业技术 > 手持终端 > Android系统的菜单类及其方法
Android系统的菜单类及其方法

菜单是应用程序UI设计不可或缺的一部分。Android系统中提供了三种形式的菜单,包括选项菜单Options Menu、子菜单SubMenu、上下文菜单Context Menu。开发者可以为应用程序添加选项菜单,也可以为界面上的一个View对象添加上下文菜单。

1.Menu类:菜单

Menu类提供了最基本的菜单对象及操作,一个Menu对象在Android手机中代表一个菜单。在Menu对象中可以添加MenuItem菜单项,也可以添加SubMenu子菜单。
1)onCreateOptionsMenu方法:初始化选项菜单
该方法用于初始化选项菜单,在应用程序第一次显示选项菜单时调用,在该方法中主要设置菜单项。在Android手机中,点击Menu按钮将调出选项菜单。语法格式:
public boolean onCreateOptionsMenu(Menu menu)
其中,参数menu表示菜单,通过该变量可以为应用程序添加各个菜单。
2)add方法:添加菜单项
该方法用于向菜单中添加菜单项,返回值为Menu类型,这是设置选项菜单的最主要方法,通常在onCreateOptionsMenu方法中调用。语法格式有多种:
public abstract MenuItem add(int groupId,int itemId,int order,CharSequence title)
public abstract MenuItem add(int groupId,int itemId,int order,int titleRes)
public abstract MenuItem add(CharSequence title)
public abstract MenuItem add(int titleRes)
其中,groupId为菜单项所在的组Id,通过为菜单项分组,可以进行批量处理,也可以赋值NONE表示不使用组Id;参数itemId为菜单项的唯一标识Id;order为菜单项的顺序,也可以赋值为NONE;参数title为菜单项所显示的菜单名称;参数titleRes为菜单项所显示的菜单名称,通过引用字符串Id来表示。
3)addSubMenu方法:添加子菜单项
该方法用于向菜单中添加子菜单项,返回值为SubMenu对象,这是设置选项子菜单的最主要方法,通常在onCreateOptionsMenu方法中调用。语法格式有多种:
public abstract SubMenu addSubMenu(int groupId,int itemId,int order,CharSequence title)
public abstract SubMenu addSubMenu(int groupId,int itemId,int order,int titleRes)
public abstract SubMenu addSubMenu(CharSequence title)
public abstract SubMenu addSubMenu(int titleRes)
其中,groupId为子菜单项所在的组Id,通过为子菜单项分组,可以进行批量处理,也可以赋值NONE表示不使用组Id;参数itemId为子菜单项的唯一标识Id;order为子菜单项的顺序,也可以赋值为NONE;参数title为子菜单项所显示的菜单名称;参数titleRes为子菜单项所显示的菜单名称,通过引用字符串Id来表示。示例:
@Override
public boolean onCreateOptionsMenu(Menu menu){
menu.add(0,1,1,"黑色");
menu.add(0,2,2,"红色");
menu.addSubMenu(0,3,3,"字号");
return super.onCreateOptionsMenu(menu);
}
4)onOptionsItemSelected方法:选中菜单处理
该方法用于设置当选项菜单中某个选项被选中时执行的操作。该方法传入的是MenuItem对象,通过该对象可以获知哪个菜单项被选中,这是执行菜单处理的主要方法。语法格式:
public boolean onOptionsItemSelected(MenuItem item)
其中,参数item为传入的菜单项,程序中通过该参数可以获取哪个菜单项被选中。示例:
TextView tv=null;
@Override
public void onCreate(Bundle savedInstancesState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tv=(TextView)findViewById(R.id.textView2);
tv.setText("设置选项菜单!");
}
@Override
public boolean onCreateOptionsMenu(Menu menu){
menu.add(0,1,1,"黑色");
menu.add(0,2,2,"红色");
menu.addSubMenu(0,3,3,"字号");
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item){
if(item.getItemId()==1){
tv.setTextColor(Color.BLACK);
}else if(item.getItemId()==2){
tv.setTextColor(Color.RED);
}
return super.onOptionsItemSelected(item);
}
5)onOptionsMenuClosed方法:选项菜单关闭处理
该方法用于设置当选项菜单关闭或退出时执行的操作,其输入参数为Menu对象。当用户执行了某个菜单,或者按了返回按键,都将触发该方法。语法格式:
public void onOptionsMenuClosed(Menu menu)
其中,参数menu为传入的菜单。示例:
@Override
public boolean onOptionsItemClosed(Menu menu){
Toast.makeText(getApplicationContext(),"关闭了选项菜单",
Toast.LENGTH_LONG).show();
super.onOptionsMenuClosed(menu);
}

2.MenuItem类:菜单项

MenuItem类用于处理MenuItem对象,每一个MenuItem对象代表了一个菜单项。通过MenuItem类可以为菜单项添加各种个性化的设置,例如图标、快捷键等。
1)getItemId方法:获取菜单项Id
该方法用于获取菜单项的Id,其返回值就是在add方法中设置的ItemId。该方法通常在onOptionsItemSelected方法中使用,通过获取Id来判断是哪个菜单项被点击,然后对应执行相应的处理代码。语法格式:
public abstract int getItemId()
2)getTitle方法:获取标题
该方法用于获取菜单项的显示标题,返回值为字符串,主要用于在程序中对菜单项进行更改设置的场合。语法格式:
public abstract CharSequence getTitle()
3)getOrder方法:获取顺序
该方法用于获取菜单项的顺序,返回值为int整型。语法格式:
public abstract int getOrder()
示例:
@Override
public boolean onOptionsItemSelected(MenuItem item){
tv.setText("菜单项"+item.getItemId()+":\r\n标题:"+item.getTitle()+"\r\n顺序:"
+item.get.Order());
return super.onOptionsItemSelected(item);
}
4)setIcon方法:设置图标
该方法用于设置菜单项显示的图标,可以通过指定图片Id或者属于Drawable对象来实现。语法格式有两种:
public abstract MenuItem seIcon(int iconRes)
public abstract MenuItem seIcon(Drawable icon)
其中,参数iconRes为引用图片的资源Id,icon为图片的drawable对象。示例:
menu1.setIcon(R.drawable.icon);
5)setAlphabeticShortcut方法:设置字母快捷键
该方法用于设置菜单项的字母快捷键。在显示菜单时,可以直接按相应的字母快捷键来执行菜单命令。语法格式:
public abstract MenuItem setAlphabeticShortcut(char alphaChar)
其中,参数alphaChar为字符,可以为a~z。示例:
menu1.setAlphabeticShortcut('b');
6)setNumericShortcut方法:设置数字
该方法用于设置菜单项的数字快捷键。在显示菜单的时候,可以直接按相应的数字快捷键来执行菜单命令。数字快捷键主要在12键数字键盘的手机上使用。语法格式:
public abstract MenuItem setNumericShortcut(char numericChar)
其中,参数numericChar为数字,可以为0~9。示例:
menu1.setNumericShortcut('1');
7)setShortcut方法:设置快捷键
该方法用于设置菜单项的字母快捷键和数字快捷键。在显示菜单的时候,可以直接按相应的字母或数字快捷键来执行菜单命令。该方法同时设置了字母快捷键和数字快捷键,可以适应不同的硬件需求。语法格式:
public abstract MenuItem setShortcut(char numericChar,char alphaChar)
其中,参数numericChar为数字快捷键,可以为0~9,主要用于12键数字键盘的手机中;alphaChar为字母快捷键,可以为a~z,主要用于QWER全键盘的手机中。示例:
menu1.setShortcut('1','b');
8)setOnMenuItemClickListener方法:设置监听器
该方法用于设置菜单项监听器。当菜单项被点击时,将触发该监听器,用户可以在该监听器中放置菜单执行代码。该方法的作用与onOptionsItemSelected方法类似,可以实现相同的功能。语法格式:
public abstract MenuItem setOnMenuItemClickListener(MenuItem.OnMenuItemClickListener menuItemClickListener)
示例:
TextView tv=null;
@Override
public void onCreate(Bundle savedInstancesState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tv=(TextView)findViewById(R.id.textView2);
tv.setText("设置选项菜单!");
}
@Override
public boolean onCreateOptionsMenu(Menu menu){
MenuItem menu1=menu.add(0,1,1,"黑色");
MenuItem menu2=menu.add(0,2,2,"红色");
menu1.setIcon(R.drawable.icon);
menu2.setIcon(R.drawable.icon);
menu1.setOnMenuItemClick(MenuItem.OnMenuItemClickListener(){
@Override
public boolean onMenuItemClick(MenuItem item){
tv.setText("点击了菜单项1");
return false;
}
});
menu2.setOnMenuItemClick(MenuItem.OnMenuItemClickListener(){
@Override
public boolean onMenuItemClick(MenuItem item){
tv.setText("点击了菜单项2");
return false;
}
});
return super.onCreateOptionsMenu(menu);
}

3.SubMenu类:子菜单

在Android中还可以设置子菜单,通过子菜单可以将相同类别的菜单命令归类。SubMenu类继承于Menu类,每一个SubMenu对象代表了一个子菜单,很多方法都与Menu类和MenuItem类相似,也有一些特有的方法。
1)setIcon方法:设置图标
该方法用于设置子菜单显示的图标,可以通过指定图片Id或使用Drawable对象来实现。通过设置图标,可以使菜单功能更明显。语法格式有两种:
public abstract SubMenu setIcon(int iconRes)
public abstract SubMenu setIcon(Drawable icon)
其中,参数iconRes为引用图片的资源Id,icon为图片的Drawable对象。
2)add方法:添加子菜单项
该方法用于向子菜单中添加菜单项,返回值为MenuItem类型,这是设置子菜单项的最主要方法,与Menu类中的add方法类似。语法格式有几种:
public abstract MenuItem add(int groupId,int itemId,int order,CharSequence title)
public abstract MenuItem add(int groupId,int itemId,int order,int titleRes)
public abstract MenuItem add(CharSequence title)
public abstract MenuItem add(int titleRes)
其中,groupId为子菜单项所在的组Id,通过为子菜单项分组,可以进行批量处理,也可以赋值NONE表示不使用组Id;参数itemId为子菜单项的唯一标识Id;order为子菜单项的顺序,也可以赋值为NONE;参数title为子菜单项所显示的菜单名称;参数titleRes为子菜单项所显示的菜单名称,通过引用字符串Id来表示。
3)setOnMenuItemClickListener方法:设置监听器
该方法用于设置子菜单项监听器,当子菜单项被点击的时候,将触发该监听器。可以在该监听器中放置菜单执行代码,该方法的作用与MenuItem类中的setOnMenuItemClickListener方法类似。语法格式:
public abstract MenuItem setOnMenuItemClickListener(MenuItem.OnMenuItemClickListener menuItemClickListener)
示例:
TextView tv=null;
@Override
public void onCreate(Bundle savedInstancesState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tv=(TextView)findViewById(R.id.textView2);
tv.setText("设置选项菜单!");
}
@Override
public boolean onCreateOptionsMenu(Menu menu){
MenuItem menu1=menu.add(0,1,1,"黑色");
MenuItem menu2=menu.add(0,2,2,"红色");
SubMenu menu3=menu.addSubMenu(0,3,3,"字号");
menu1.setIcon(R.drawable.icon);
menu2.setIcon(R.drawable.icon);
menu3.setIcon(R.drawable.icon);
MenuItem sub1=menu3.add(1,4,4,"10号");
MenuItem sub2=menu3.add(1,5,5,"15号");
MenuItem sub3=menu3.add(1,6,6,"20号");
MenuItem sub4=menu3.add(1,7,7,"25号");
sub1.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener(){
@Override
public boolean onMenuItemClick(MenuItem item){
tv.setTextSize(10);
return false;
}
});
sub2.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener(){
@Override
public boolean onMenuItemClick(MenuItem item){
tv.setTextSize(15);
return false;
}
});
sub3.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener(){
@Override
public boolean onMenuItemClick(MenuItem item){
tv.setTextSize(20);
return false;
}
});
sub4.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener(){
@Override
public boolean onMenuItemClick(MenuItem item){
tv.setTextSize(25);
return false;
}
});
return super.onCreateOptionsMenu(menu);
}

4.ContextMenu类:上下文菜单

ContextMenu类继承于Menu类,实现了上下文菜单的功能。在Android中上下文菜单注册到某个View对象上,用户通过长按该View对象便可以调出上下文菜单。在Android系统中,上下文菜单不支持快捷键,可以为任意的View对象添加上下文菜单,也可以在已有的上下文菜单中添加新菜单项。ContextMenu类中的很多方法都与Menu类和MenuItem类相似。
1)registerForContextMenu方法:注册上下文菜单
该方法用于为一个View对象注册上下文菜单,其输入参数为控件的View对象。在使用上下文菜单之前,必须首先使用该方法进行注册,否则将无法使用。语法格式:
public void registerForContextMenu(View view)
其中,参数view为Activity上的一个View对象,主要是控件。
2)onCreateContextMenu方法:初始化上下文菜单
该方法用于初始化上下文菜单,在应用程序每次显示上下文菜单的时候调用。在该方法中,主要通过add方法设置上下文菜单项。语法格式:
public void onCreateContextMenu(ContextMenu menu,View v,ContextMenuInfo menuInfo)
其中,参数menu为上下文菜单对象,通过该变量可以为应用程序添加各个菜单;参数v注册上下文菜单的View对象;menuInfo为上下文菜单需要额外显示的信息。示例:
TextView tv=null;
EditText et=null;
@Override
public void onCreate(Bundle savedInstancesState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tv=(TextView)findViewById(R.id.textView1);
et=(EditText)findViewById(R.id.editText1);
this.registerForContextMenu(tv);
this.registerForContextMenu(et);
}
@Override
public void onCreateContextMenu(ContextMenu menu,View v,ContextMenuInfo menuInfo){
menu.setHeaderIcon(R.drawable.icon);
if(v==tv){
menu.add(0,1,1,"10号");
menu.add(0,1,1,"20号");
menu.add(0,1,1,"30号");
menu.add(0,1,1,"40号");
}else if(v==et){
menu.add(0,1,1,"20号");
menu.add(0,1,1,"40号");
}
return super.onCreateOptionsMenu(menu,v,menuInfo);
}
3)onContextItemSelected方法:选中菜单处理
该方法用于设置当上下文菜单中某个选项被选中中时执行的操作。该方法传入的是MenuItem对象,通过该对象可以获知哪个菜单项被选中,这是执行菜单处理的主要方法。语法格式:
public boolean onContextItemSelected(MenuItem item)
其中,参数item为传入的菜单项,程序中通过该参数可以获知哪个菜单项被选中。示例:
@Override
public boolean onContextItemSelected(MenuItem item){
switch(item.getItemId()){
case 1:
tv.setTextSize(10);
break;
case 2:
tv.setTextSize(20);
break;
case 3:
tv.setTextSize(30);
break;
case 4:
tv.setTextSize(40);
break;
case 5:
et.setTextSize(20);
break;
case 6:
et.setTextSize(40);
break;
}
return super.onContextItemSelected(item);
}
4)onContextMenuClosed方法:关闭上下文菜单处理
该方法用于设置当上下文菜单关闭或退出时执行的操作,其输入参数为Menu对象。当用户执行了某个菜单,或者按了返回键,都将触发该方法。语法格式:
public void onContextMenuClosed(Menu menu)
其中,参数menu为传入的菜单。示例:
@Override
public void onContextMenuClosed(Menu menu){
Toast.makeText(getApplicationContext(),"你退出了上下文菜单!",
Toast.LENGTH_LONG).show();
return super.onContextMenuClosed(menu);
}

Copyright@dwenzhao.cn All Rights Reserved   备案号:粤ICP备15026949号
联系邮箱:dwenzhao@163.com  QQ:1608288659