android提供了三种菜单类型,分别为optionsmenu,context menu,sub menu。options menu就是通过按home键来显示,context menu需要在view上按上2s后显示。这两种menu都有可以加入子菜单,子菜单不能种不能嵌套子菜单。
options menu最多只能在屏幕最下面显示6个菜单选项,成为iconmenu,icon menu不能有checkable选项。多余6的会以more icon menu来调出,成为expanded menu。options menu通过activity的onCreateOptionsMenu来生成,这个函数只会在menu第一次生成时调用。任何想改变options menu的想法只能在onPrepareOptionsMenu来实现,这个函数会在menu显示前调用。onOptionsItemSelected 处理选中的菜单项。
context menu是跟某个具体的view绑定在一起,在activity种用registerForContextMenu来为某个view注册contextmenu。context menu在显示前都会调用onCreateContextMenu来生成menu。onContextItemSelected选中的菜单项。
android还提供了对菜单项进行分组的功能,可以把相似功能的菜单项分成同一个组,这样就可以通过调用setGroupCheckable,setGroupEnabled,setGroupVisible来设置菜单属性,而无须单独设置。
1、利用xml定义选项菜单
a) options menu通过activity的onCreateOptionsMenu来生成
b) 这个函数只会在menu第一次生成时调用。
i. 任何想改变options menu的想法只能在onPrepareOptionsMenu来实现,这个函数会在menu显示前调用。
c) onOptionsItemSelected 用来处理选中的菜单项。
2、 响应菜单项单击事件
3种方式
menuOptionsSelected
menuItemSelected
onMenuItemClick
3、 动态添加、修改和删除菜单项
菜单项的增删改查
增:add, addSubMenu
删:removeItem,removeGroup
改:
l 选项菜单:onPrepareOptionsMenu()——> MenuItem->setXXX()
l 上下文菜单:onCreateContextMenu(ContextMenu menu, Viewv,ContextMenuInfo menuInfo) {} 方法在每次调用上下文菜单时都会被调用一次
一、option Menu
下面用一段很简单的代码来演示option Menu
public class MenuTestActivity1 extends Activity implements
OnMenuItemClickListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = this.getMenuInflater();
inflater.inflate(R.menu.options_menu, menu);
for (int i = 0; i < menu.size(); i++) {
menu.getItem(i).setOnMenuItemClickListener(this);
}
return true;
}
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.newFile:
// Toast.makeText(this,"new file", Toast.LENGTH_LONG).show();
break;
case R.id.exit:
// Toast.makeText(this,"exit", Toast.LENGTH_LONG).show();
this.finish();
break;
}
return false;
}
}
当点击退出是按钮式即可产生响应:
二、sub Menu(子菜单)
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 class MenuTestActivity3 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(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
//只在选项菜单第一次显示时调用
public boolean onCreateOptionsMenu(Menumenu){
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);
return true;
}
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()){
case R.id.menuitem1:
Toast.makeText(this, "newfile", Toast.LENGTH_LONG).show();
break;
case R.id.menuitem2:
Toast.makeText(this,"exit", Toast.LENGTH_LONG).show();
break;
case SUBITEM1:
break;
case SUBITEM2:
this.finish();
break;
}
return true;
}
}
运行起来的效果图如下:
三、 上下文菜单 contextmenu:
上下文菜单:onCreateContextMenu(ContextMenumenu, View v,ContextMenuInfo menuInfo) {} 方法在每次调用上下文菜单时都会被调用一次
具体简单的实现代码:
public class MenuTestActivity4 extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView tv = (TextView) this.findViewById(R.id.textView);
this.registerForContextMenu(tv);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.subitem1:
Toast.makeText(this, "subitem1", Toast.LENGTH_LONG).show();
break;
case R.id.subitem2:
break;
}
return super.onContextItemSelected(item);
}
int i=1;
// 每次上下文菜单显示都会调用
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
MenuInflater inflater = this.getMenuInflater();
inflater.inflate(R.menu.sub_menu, menu);
i++;
menu.getItem(0).setTitle("x"+i);
super.onCreateContextMenu(menu, v, menuInfo);
}
}