android中的菜单
菜单是一种常见的应用程序与用户交互的方式,他使用类似列表的形式显示用户可以操作的功能
,而用户则可以通过菜单来选择要执行的操作,应用程序也可以对用户的选择进行相关的响应。
选项菜单
选项菜单(OptionsMenu)是通过点击设备上Menu建弹出的菜单;
子菜单(SubMenu)是选择某个菜单项后,再次弹出的下级菜单。
上下文菜单(ContextMenu)是通过长按(通常是2秒)某个控件后显示的菜单;
使用资源文件创建选项菜单
选项菜单 通过res\menu下的XML文件可以配置选项菜单。
xmls:tools="http://schemas.android.com/tools"
tools:context="cn.edu.menu.MainActivity">
android:id="@+id/action_setings"
android:orderInCategory="100"
android:showAsAction="never"
android:title="@string/action_settings"/>
在Activity中的onCreateOptionsMenu()方法将用于实现选项菜单的加载,通常使用开发工具创建Activity
时,对应的部分代码已自动生成:
public boolean onCreateOptionMenu(Menu menu){
getMenuInflater().inflate(R.menu.main,menu);
return true;
}
在Activity中的onOptionsItemSelected()方法将用于选项菜单中菜单项的响应,通常使用开发工具创建Activity时
,对应的代码已经自动生成:
public boolean onOptionsItemSelected(Menuitem item){
int id = item.getItemId();
if(id==R.id.action_settings){
return true;
}
return super.onOptionsItemSelected(item);
}
通常在配置选项菜单时,需要为每个菜单项配置如下属性:
id:菜单项的ID标识,用于响应菜单项时,判断当前点击的哪个菜单项;
orderInCategory:序号,即存在多个菜单项时的排序,取值为整数,数值越小,则越靠前显示,数值越大
,则越靠后显示;
showAsAction:将菜单项显示在ActionBar上,取值为枚举型,包括never、always、ifRooms、withText、collapseActionView;
title:菜单项上显示的文字。
实例:
xmls:tools="http://schemas.android.com/tools"
tools:context="cn.edu.menu.MainActivity">
android:id="@+id/action_file"
android:orderInCategory="101"//菜单项的排列顺序
android:showAsAction="never"
android:title="file"/>
android:id="@+id/action_refactor"
android:orderInCategory="103"
android:showAsAction="never"
android:title="Refactor"/>
android:id="@+id/action_edit"
android:orderInCategory="102"
android:showAsAction="never"
android:title="Edit"/>
Activity:
public boolean onOptionsItemSelected(Menuitem item){
int id = item.getItemId();
switch(id){
case R.id.action_file:
Toast.makeText(this,"您选择了File",Toast。LENGTH_SHORT).show();
break;
case R.id.action_edit:
Toast.makeText(this,"您选择了Edit",Toast。LENGTH_SHORT).show();
break;
case R.id.action_refactor:
Toast.makeText(this,"您选择了Refactor",Toast。LENGTH_SHORT).show();
break;
}
return super.onOptionsItemSelected(item);
}
实用程序代码创建选项菜单
Menu类中定义的创建菜单项的方法:
public MenuItem add(int groupId,int itemId,int order,CharSequence title)
public MenuItem add(int groupId,int itemId,int order,int titleRes)
private static final int MENU_FILE_ID = 9527;
private static final int MENU_EDIT_ID = 1111;
private static final int MENU_REFACTOR_ID = 2222;
private static final int MENU_WINDOW_ID = 3333;
private static final int MENU_HELP_ID = 4444;
public boolean onCreateOptionsMenu(Menu menu){
menu.add(Menu.NONE,MENU_FILE_ID,1,"File");
menu.add(Menu.NONE,MENU_HELP_ID,5,"Help");
menu.add(Menu.NONE,MENU_WINDOW_ID,4,"Window");
menu.add(Menu.NONE,MENU_REFACTOR_ID,3,"Refactor");
menu.add(Menu.NONE,MENU_EDIT_ID,2,"Edit");
return true;
}
public boolean onOptionsItemSelected(Menuitem item){
int id = item.getItemId();
switch(id){
case MENU_FILE_ID:
Toast.makeText(this,"您选择了File",Toast。LENGTH_SHORT).show();
break;
case MENU_EDIT_ID:
Toast.makeText(this,"您选择了Edit",Toast。LENGTH_SHORT).show();
break;
case MENU_REFACTOR_ID:
Toast.makeText(this,"您选择了Refactor",Toast。LENGTH_SHORT).show();
break;
case MENU_WINDOW_ID:
Toast.makeText(this,"您选择了Window",Toast。LENGTH_SHORT).show();
break;
case MENU_HELP_ID:
Toast.makeText(this,"您选择了Help",Toast。LENGTH_SHORT).show();
break;
}
return super.onOptionsItemSelected(item);
}
为选项菜单添加子菜单
选项菜单的子菜单(SubMenu)亦可通过配置文件或程序代码创建:
通过配置文件创建子菜单:为原有的上级菜单项的节点添加
并在
通过程序代码创建子菜单:调用Menu对象的addSubMenu()创建一般菜单项,通过
返回值SubMenu对象创建子菜单。
private static final int MENU_FILE_ID = 9527;
private static final int MENU_EDIT_ID = 1111;
private static final int MENU_REFACTOR_ID = 2222;
private static final int MENU_WINDOW_ID = 3333;
private static final int MENU_HELP_ID = 4444;
private static final int MENU_SOURCE_ID = 8888;
public boolean onCreateOptionsMenu(Menu menu){
menu.add(Menu.NONE,MENU_FILE_ID,1,"File");
menu.add(Menu.NONE,MENU_HELP_ID,5,"Help");
menu.add(Menu.NONE,MENU_WINDOW_ID,4,"Window");
menu.add(Menu.NONE,MENU_REFACTOR_ID,3,"Refactor");
menu.add(Menu.NONE,MENU_EDIT_ID,2,"Edit");
SubMenu subMenu = menu.addSubMenu(Menu.NONE,MENU_SOURCE_ID,4,"source");
subMenu.add(Menu.NONE,0,1,"Format");
subMenu.add(Menu.NONE,1,2,"Clean Up");
return true;
}
通过配置文件设置:
public boolean onCreateOptionMenu(Menu menu){
getMenuInflater().inflate(R.menu.main,menu);
return true;
}
xmls:tools="http://schemas.android.com/tools"
tools:context="cn.edu.menu.MainActivity">
android:id="@+id/action_file"
android:orderInCategory="101"//菜单项的排列顺序
android:showAsAction="never"
android:title="file">
android:id="@+id/action_file_open"
android:orderInCategory="1022"
android:showAsAction="never"
android:title="Open"/>
android:id="@+id/action_file_save"
android:orderInCategory="1012"
android:showAsAction="never"
android:title="Save"/>
android:id="@+id/action_refactor"
android:orderInCategory="103"
android:showAsAction="never"
android:title="Refactor"/>
android:id="@+id/action_edit"
android:orderInCategory="102"
android:showAsAction="never"
android:title="Edit"/>
创建上下文菜单
通过重写Activity的onCreateContextMenu()方法可以初始化上下文菜单,菜单项的创建方式
与在选项菜单中创建菜单项相同;
需要调用registerForContextMenu(View view)方法将上下文菜单注册到某个控件之上;
通过重写Activity的onContextMenuSelected()方法可以相应上下文菜单中的选中事件。
private ImageView imageview;
registerForContextMenu(imageview);
private static final int MENU_CHANGE_ID = 9521;
private static final int MENU_SAVE_ID =9522;
public void onCreateContextMenu(ContextMenu menu,View v,
ContextMenuInfo menuInfo){
menu.add(Menu.NONE,MENU_CHANGE_ID,1,"Change");
menu.add(Menu.NONE,MENU_SAVE_ID,2,"Save");
super.onCreateContextMenu(menu,v,menuInfo);
}
public boolean onContextItemSelected(MenuItem item){
switch(item.getItemId()){
case MENU_CHANGE_ID:
break;
case MENU_SAVE_ID:
break;
}
return super.onContextItemSelected(item);
} 在ListView中创建上下文菜单