Android菜单详解
菜单是Android系统中重要的用户接口之一。
Android提供了三种菜单类型,分别为options menu(选项菜单),context menu(上下文菜单),sub menu(子菜单)。
options menu就是通过按home键来显示,context menu需要在view上按上2s后显示。这两种menu都有可以加入子菜单,子菜单不能嵌套子菜单。
options menu最多只能在屏幕最下面显示6个菜单选项,成为icon menu,icon menu不能有checkable选项。多余6个的会以moreicon menu来调出,成为expanded menu。optionsmenu通过activity的onCreateOptionsMenu来生成,这个函数只会在menu第一次生成时调用。任何想改变options menu的想法只能在onPrepareOptionsMenu来实现,这个函数会在menu显示前调用。
选项菜单:
用Activity类的onCreateOptionsMenu方法来创建选项菜单。
方法定义:public Boolean onCreateOptionsMenu(Menu menu)
public classMenu1Activity extends Activity implementsOnMenuItemClickListener{//菜单项单击事件类实现OnMenuItemClickListener接口
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
//创建菜单
publicboolean onCreateOptionsMenu(Menu menu) {
MenuInflaterinflater=this.getMenuInflater();
inflater.inflate(R.menu.menu1,menu);
//监听所有菜单项
for(int i=0;i<menu.size();i++){
menu.getItem(i).setOnMenuItemClickListener(this);
}
returntrue;
}
//显示菜单项和弹出的内容
@Override
publicboolean onOptionsItemSelected(MenuItem item) {
//利用switch语句显示菜单项
switch(item.getItemId()){
caseR.id.ss:
Toast.makeText(this,"搜索框",Toast.LENGTH_LONG).show();
break;
caseR.id.xj:
Toast.makeText(this,"查看",Toast.LENGTH_LONG).show();
break;
caseR.id.xx:
Toast.makeText(this,"选项",Toast.LENGTH_LONG).show();
break;
caseR.id.zh:
Toast.makeText(this,"账户",Toast.LENGTH_LONG).show();
break;
caseR.id.io:
Toast.makeText(this,"导入与导出",Toast.LENGTH_LONG).show();
break;
}
returntrue;
}
上下文菜单:
上下文菜单可以和任意View对象进行关联,如TextView,EditText,Button等。上下文菜单与子菜单效果有些类似。
创建上下文菜单首先要覆盖Activity类的onCreateContextMenu方法。
方法定义:public void onCreateContextMenu(CreateContextMenu,View view,ContextMenuInfo menuInfo)
上下文菜单使用ContextMenu接口的setHeader.Title和setHeaderIcon方法设置上下文菜单头的标题和图像。
上下文菜单可以带选项按钮和复选框,不支持嵌套子菜单。
上下文菜单必须注册到指定的View上才可以显示,可以使用Activity类的registerForContextMenu方法。
上下文菜单的单击事件可以使用onMenuItemSeleted方法来响应。
public class MenuTestActivity4 extends Activity {
public voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextViewtv = (TextView) this.findViewById(R.id.textView);
this.registerForContextMenu(tv);
}
@Override
publicboolean onContextItemSelected(MenuItem item) {
switch(item.getItemId()) {
caseR.id.subitem1:
Toast.makeText(this,"subitem1", Toast.LENGTH_LONG).show();
break;
caseR.id.subitem2:
break;
}
returnsuper.onContextItemSelected(item);
}
int i=1;
// 每次上下文菜单显示都会调用
public voidonCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfomenuInfo) {
MenuInflaterinflater = this.getMenuInflater();
inflater.inflate(R.menu.sub_menu,menu);
i++;
menu.getItem(0).setTitle("x"+i);
super.onCreateContextMenu(menu,v, menuInfo);
}
}
子菜单:
Menu接口的addSubMenu方法用来添加子菜单,addSubMenu方法和add方法的参数个数和类型完全相同,所部同的是它们的返回值类型。子菜单可以带复选框和选择按钮。
1、Xml创建2、动态创建
Menu submenu =Menu.addSubMenu(x, x, x, x)
submenu.add()
submenu.add()
main_menu.addSubMenu(x,x,x,x);
或:
getMenuInflater().inflater(R.menu.submenu, submenu);
要想实现subMenu只需将上面的OnCreateOptionMenu这个方法的内的代码修改即可:
public classMenuTestActivity3 extends Activity {
private static final int SUBMENU = 10;
private static final int SUBITEM1 =SUBMENU+1;
private static final int SUBITEM2 =SUBMENU+2;
private static final int SUBITEM3 =SUBMENU+3;
public void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
//只在选项菜单第一次显示时调用
public booleanonCreateOptionsMenu(Menu menu){
MenuInflaterinflater = this.getMenuInflater();
inflater.inflate(R.menu.sub_menu,menu);
SubMenusubMenu = menu.addSubMenu(1,SUBMENU, 1, "子菜单");
subMenu.add(20,SUBITEM1,1,"wwww");
subMenu.add(20,SUBITEM2,2,"subitem2");
subMenu.add(30,SUBITEM3,3,"subitem3");
subMenu.setGroupCheckable(20,true,true);
MenuItemitem = subMenu.getItem(0);
item.setChecked(true);
subMenu.findItem(SUBITEM3).setCheckable(true);
returntrue;
}
public boolean onOptionsItemSelected(MenuItemitem) {
switch(item.getItemId()){
case R.id.menuitem1:
Toast.makeText(this, "newfile", Toast.LENGTH_LONG).show();
break;
caseR.id.menuitem2:
Toast.makeText(this,"exit", Toast.LENGTH_LONG).show();
break;
case SUBITEM1:
break;
case SUBITEM2:
this.finish();
break;
}
return true;
}
}