Android的菜单分为三种类型:选项菜单(Option Menu)、上下文菜单(Context Menu)、子菜单(Sub Menu)。
选项菜单(Option Menu):按设备上的菜单按钮(Menu)会出现的菜单。不支持勾选标记。
上下文菜单(Context Menu):长按某个组件会出现的菜单。不支持菜单项图标。
子菜单(SubMenu):就是子菜单。不支持菜单项图标,不支持嵌套子菜单。
Menu类用于添加菜单项和子菜单的方法是add()和addSubMenu():
MenuItem add(CharSequence title):添加一个菜单项
MenuItem add(int groupId, int itemId, int order, int titleRes):添加一个处于groudId组的菜单项
MenuItem add(int titleRes):添加一个菜单项
MenuItem add(int groupId, int itemId, int order, CharSequence title):添加一个处于groudId组的菜单项
SubMenu addSubMenu(int groupId, int itemId, int order, CharSequence title):添加一个处于groudId组的子菜单
SubMenu addSubMenu(int groupId, int itemId, int order, int titleRes):添加一个处于groudId组的子菜单
SubMenu addSubMenu(CharSequence title):添加一个子菜单
SubMenu addSubMenu(int titleRes):添加一个子菜单
(1)选项菜单的创建方法:
1、重写Activity的onCreateOptionsMenu(Menu menu)方法。
2、调用Menu的add()方法添加菜单项(MenuItem),可以调用MenuItem的setIcon()方法为菜单项设置图标。
3、重写Acitivy的onOptionsMenuSelected()方法为菜单设置事件监听。
(2)子菜单的创建方法:
1、重写Activity的onCreateOptionsMenu()方法,调用Menu的addSubMenu()方法添加子菜单。
2、调用SubMenu的add()方法,添加子菜单项。
3、重写onCreateItemSelected()方法,为菜单设置监听事件。
SubMenu类还提供了额外的方法来设置菜单头的信息:
SubMenu setHeaderIcon(Drawable icon):设置菜单头的图标。
SubMenu setHeaderIcon(int iconRes):设置菜单头的图标。
SubMenu setHeaderTitle(CharSequence title):设置菜单头的标题。
SubMenu setHeaderTitle(int titleRes):设置菜单头的标题。
SubMenu setHeaderView(View view):使用View组件设置菜单头。
(3)上下文菜单的创建方法:
1、重写Activity的onCreateContextMenu(ContextMenu, View, ContextMenu.ContextMenuInfo)方法,View参数设置的是触发上下文菜单的组件。
2、调用Menu的add()方法添加菜单项MenuItem
3、重写onContextItemSelected()方法,为上下文菜单设置事件监听。
4、调用registerForContextMenu(View)方法,为View组件注册上下文菜单。
同样我们可以用setHeaderIcon()、setHeaderTitle()方法为上下文菜单设置图标、标题。
(4)为菜单项设置事件监听:
我们重写Activity的onCreateItemSelected()方法来设置事件监听,一般我们用switch方法判断是哪个菜单项被单击,所以我们需要为每个菜单项设置一个id,以方便判断。
当然我们还有另一个方法就,就是为每个菜单项绑定监听器,用setOnMenuItemClickListener()方法,但这样做是很麻烦的,不推荐。
(5)设置单选菜单项和多选菜单项:
setCheckable(boolean checkable):设置该菜单项可否被勾选。
setGroupCheckable(int group,boolean checkable,boolean exclusive):设置group组的菜单项是否可以被勾选,如果exclu设置为true,那么该组为单选菜单项。
(6)为菜单项设置快捷键(现在好像没什么用了):
setAlphabeticShortcut(char alphaChar):设置字母快捷键。
setNumericShortcut(char numericChar):设置数字快捷键。
setShortcut(char numericChar, char alphaChar):同时设置两种快捷键。
(7)设置与Activity关联的菜单项:
用于单击某个菜单项时可以跳转到其他Activity。
用setIntent(Intent intent)方法。
(8)使用XML文件创建菜单:
创建方法是
1.在res文件下面的menu文件目录下创建菜单的xml文件。
2.在Activity的onCreateOptionsMenu()方法或onCreateContextMenu()方法中用inflate(int menuRes, Menu menu)方法加载对应资源。
3.重写Activity相关的事件监听方法。
menu文件夹下的xml有如下的规则:
1.根元素是<menu.../>,没有多余的属性。
2.<group.../>将多个菜单项<item.../>包装成一个菜单组。
可以设置如下属性:
checkableBehavior:菜单项额选择行为,none(不可选)、all(多选)、single(单选)。
menuCategory:指定菜单项的优先级,container、system、secondary和alternative。
visible:是否可见
enable:是否可用
3.<item.../>用于定义菜单项,内部可包含<menu.../>,就成了子菜单。
可以设置的属性如下:
android:id:设置ID
android:title:设置标题
android:icon:设置图标
android:alphabeticShortcut:设置字母快捷键
android:numbericShortcut:设置数字快捷键
android:checkable:是否可选
android:checked:是否选中
android:visible:是否可见
android:enable:是否可用
(9)弹出式菜单PopupMenu
创建步骤如下:
1、new PopupMenu(Context context,View anchor)创建弹出式菜单,anchor参数表示触发菜单的组件。
2、调用MenuInflater的inflate()方法加载菜单资源。
3、调用PopupMenu的show()方法显示弹出式菜单。