三种menu:1、OptionsMenu;2、ContextMenu;3、SubMenu
一、OptionsMenu
public boolean onCreateOptionsMenu(Menu menu):使用此方法调用OptionsMenu 。
public boolean onOptionsItemSelected(MenuItem item):选中菜单项后发生的动作。
public void onOptionsMenuClosed(Menu menu):菜单关闭后发生的动作。
public boolean onPrepareOptionsMenu(Menu menu):选项菜单显示之前onPrepareOptionsMenu方法会被调用,你可以用此方法来根据打当时的情况调整菜单。如果返回为false,则onCreateOptionsMenu(Menu menu)将不会被调用。
public boolean onMenuOpened(int featureId, Menu menu):单打开后发生的动作。
默认样式是在屏幕底部弹出一个菜单,这个菜单我们就叫他选项菜单OptionsMenu,一般情况下,选项菜单最多显示2排每排3个菜单项,这些菜单项有文字有图标,也被称作Icon Menus,如果多于6项,从第六项开始会被隐藏,在第六项会出现一个More里,点击More才出现第六项以及以后的菜单项,这些菜单项也被称作Expanded Menus
如下一个利用系统再带图标实现的OptionMenu实例:
@Override
public boolean onCreateOptionsMenu(Menu menu){
menu.add(Menu.NONE,Menu.FIRST+1,5,"删除").setIcon(android.R.drawable.ic_delete);
menu.add(Menu.NONE, Menu.FIRST + 2, 2, "保存").setIcon(android.R.drawable.ic_menu_edit);
menu.add(Menu.NONE, Menu.FIRST + 3, 6, "帮助").setIcon(android.R.drawable.ic_menu_help);
menu.add(Menu.NONE, Menu.FIRST + 4, 1, "添加").setIcon(android.R.drawable.ic_menu_add);
menu.add(Menu.NONE, Menu.FIRST + 5, 4, "详细").setIcon(android.R.drawable.ic_menu_info_details);
menu.add(Menu.NONE, Menu.FIRST + 6, 3, "发送").setIcon(android.R.drawable.ic_menu_send);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item){
switch(item.getItemId()){
case Menu.FIRST + 1:
Toast.makeText(this, "删除菜单被点击了", Toast.LENGTH_LONG).show();
break;
case Menu.FIRST + 2:
Toast.makeText(this, "保存菜单被点击了", Toast.LENGTH_LONG).show();
break;
case Menu.FIRST + 3:
Toast.makeText(this, "帮助菜单被点击了", Toast.LENGTH_LONG).show();
break;
case Menu.FIRST + 4:
Toast.makeText(this, "添加菜单被点击了", Toast.LENGTH_LONG).show();
break;
case Menu.FIRST + 5:
Toast.makeText(this, "详细菜单被点击了", Toast.LENGTH_LONG).show();
break;
case Menu.FIRST + 6:
Toast.makeText(this, "发送菜单被点击了", Toast.LENGTH_LONG).show();
break;
}
return false;
}
二、ContextMenu
当一个视图注册到一个上下文菜单时,执行一个在该对象上的“长按”(按住不动差不多两秒钟)动作,将出现一个提供相关功能的浮动菜单,这个菜单就是上下文菜单。
分三个步骤实现:
1、重载public void onCreateContextMenu(ContextMenu menu,View v,ContextMenuInfo info)
2、重载public boolean onContextItemSelected(MenuItem item)
3、为一个view注册 ,registerForContextMenu(View v)
如下一个例子:
@Override
public void onCreateContextMenu(ContextMenu contextMenu,View view,ContextMenuInfo info){
super.onCreateContextMenu(contextMenu, view, info);
contextMenu.add(ContextMenu.NONE, 0, 0, "Edit");
contextMenu.add(ContextMenu.NONE, 1, 1, "Delete");
}
@Override
public boolean onContextItemSelected(MenuItem item){
AdapterContextMenuInfo info = (AdapterContextMenuInfo)item.getMenuInfo();
switch(item.getItemId()){
case 0:
Toast.makeText(this, "Edit", Toast.LENGTH_LONG).show();
return true;
case 1:
Toast.makeText(this, "Delete", Toast.LENGTH_LONG).show();
return true;
default:
return super.onContextItemSelected(item);
}
}
然后在Activity的onCreate中添加:
View mainView = View.inflate(this, R.layout.main, null);
registerForContextMenu(mainView);
三、SubMenu
子菜单就是将相同功能的分组进行多级显示的一种菜单。
创建子菜单的步骤:
1、 覆盖Activity的onCreateOptionsMenu()方法,调用Menu的addSubMenu()方法来添加子菜单
2、 调用SubMenu的add()方法,添加子菜单
3、 覆盖onContextItemSelected()方法,响应子菜单的单击事件
看下面一个例子:
private static final int ITEM1 = Menu.FIRST;
private static final int ITEM2 = Menu.FIRST + 1;
//..............................
@Override
public boolean onCreateOptionsMenu(Menu menu){
SubMenu file = menu.addSubMenu("文件");
SubMenu edit = menu.addSubMenu("编辑");
file.add(Menu.NONE, ITEM1, 0, "新建");
file.add(Menu.NONE, ITEM2, 1, "打开");
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item){
switch (item.getItemId()) {
case ITEM1:
setTitle("新建文件");
break;
case ITEM2:
setTitle("打开文件");
break;
}
return true;
}