1、选项菜单 OptionsMenu
2、上下文菜单 ContextMenu
3、子菜单 SubMenu
1. 选项菜单 OptionsMenu
OptionsMenu 菜单的创建方式有两种:一种是在程序中用Java代码创建一个Options Menu; 一种是在XML中定义。
1.1 方式一:代码创建
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// 使用java代码实现菜单
MenuItem menuItem = menu.add(1001, 100, 1, "系统菜单");
menuItem.setTitle("菜单一");
MenuItem menuItem2 = menu.add(1001, 101, 2, "用户菜单");
menuItem2.setTitle("菜单二");// 最多可以显示6个子菜单
MenuItem menuItem3 = menu.add(1001, 102, 2, "客户菜单");
menuItem3.setTitle("菜单三");// 最多可以显示6个子菜单
menuItem3.setShortcut('c', 'c');// 给指定的菜单设置快捷键
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case 100:
Intent intent = new Intent(MainActivity.this, NextActivity.class);
item.setIntent(intent);
break;
case 101:
Toast.makeText(MainActivity.this, "选择了菜单二", 1).show();
break;
case 102:
Toast.makeText(MainActivity.this, "选择了菜单三", 1).show();
break;
}
return super.onOptionsItemSelected(item);
}
2.方式二:在XML中定义
1. 在/res/menu目录下新建 xml文件。 <menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/menu_settings" android:icon="@drawable/sys" android:orderInCategory="100" android:showAsAction="ifRoom|withText" android:title="@string/menu_settings"> <menu> <item android:id="@+id/create_new" android:title="新建文件"> </item> <item android:id="@+id/open" android:title="打开文件"/> </menu> </item> <item android:id="@+id/sys" android:icon="@drawable/sys" android:orderInCategory="101" android:showAsAction="never" android:title="用户菜单"> <menu> <group android:id="@+id/group1" > <item android:id="@+id/load" android:title="加载文件"> </item> </group> <group android:id="@+id/group2" > <item android:id="@+id/save" android:title="保存文件"> </item> </group> </menu> </item> </menu> | 2. 在MainActivity中操作 |
可以找到API文档的说明,在User Interface--->Menus--->Creating Contextual Menus.
上下文菜单很像一个浮动窗口。你可以为任何一个View提供context menu,但一般在ListView和GridView上用的比较多。
在桌面电脑,我们都很熟悉Context menu,按鼠标右键显示的菜单就是context菜单。在Android中,通过长时间鼠标按键可以触发context菜单。对于触屏设备,手指长按就是长鼠标按键事件。
一个activity有且只有一个OptionMenu,一个view有且只有一个ContextMenu。检查鼠标长按是基于view来监听。因此一个activity中可有多少个view,就可以有多少个ContextMenu。
下面用一个例子,演示一下怎么操作 context menu.
1. 在MainActivity中的操作 | 2. menu.xml <menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/edit" android:orderInCategory="100" android:showAsAction="never" android:title="Edit"/> <item android:id="@+id/share" android:orderInCategory="100" android:showAsAction="never" android:title="Share"/> <item android:id="@+id/delete" android:orderInCategory="100" android:showAsAction="never" android:title="Delete"/> </menu> 效果图: 这部分知识也可以参考这篇文章:Android 菜单(ContextMenu) |
3. ActionMode
在高版本一般用ActionMode来替换浮动的context menu。它可以显示在屏幕的顶端来执行用户的一些操作,长键,复选框全选都可以用这个来完成。
下面我们用一个例子来显示其操作方法,也要有一个menu的xml文件,我们就用上面那个xml文件吧。
其Activity中的操作如下:长按一个按钮时,出现actionmode操作。
private ActionMode actionMode; // 使用ActionMode完成菜单操作
button = (Button) this.findViewById(R.id.button1);
//一定要是长按事件
button.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if (actionMode != null) {
return false;
}
actionMode = startActionMode(actionCallback);
v.setSelected(true);
return true;
}
});
private ActionMode.Callback actionCallback = new ActionMode.Callback() {
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return false;
}
@Override
public void onDestroyActionMode(ActionMode mode) {
actionMode = null;
}
// 表示我们要加载菜单,从xml中加载
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.activity_main, menu);
return true;
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
switch (item.getItemId()) {
case R.id.edit:
edit();
break;
case R.id.delete:
Toast.makeText(MainActivity.this, "Delete", 1).show();
break;
case R.id.share:
Toast.makeText(MainActivity.this, "Share", 1).show();
break;
}
return false;
}
};
public void edit() {
Toast.makeText(MainActivity.this, "Edit", 1).show();
}
Popup Menu弹出显示在控件的上方或下方。不用长按,点一下就会触发。
button2 = (Button)this.findViewById(R.id.button2); button2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { PopupMenu popupMenu = new PopupMenu(MainActivity.this, v); popupMenu.setOnMenuItemClickListener(new OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { switch (item.getItemId()) { case R.id.edit: edit(); break; case R.id.delete: Toast.makeText(MainActivity.this, "Delete", 1).show(); break; case R.id.share: Toast.makeText(MainActivity.this, "Share", 1).show(); break; } return false; } }); MenuInflater inflater = popupMenu.getMenuInflater(); inflater.inflate(R.menu.activity_main, popupMenu.getMenu()); popupMenu.show();//显示菜单 } });
在平板电板上,没有菜单按键出现,解决方法想看这篇文章:平板电脑没有出现menu 按键显示 解决
还可以用独立按键的方式打开Menu菜单:android 独立按键和菜单键 打开menu