本文参考自官方文档:https://developer.android.com/guide/topics/ui/menus.htmlhtml
Android为了维护app之间一个统一的操做习惯,提供了Menus来处理用户和Activity之间的一些交互。可是在不一样的系统版本上面推荐的Menu不同。好比在android 3.0如下,因为Google会要求全部设备生产商提供一个菜单的实体键,因此在3.0一下菜单的主要弹出方式就是点击菜单实体键,弹出6个条目的菜单面板。在3.0之后,引入ActionBar,打开菜单行为转变成点击ActionBar上面的overflow按钮。这两种菜单面板的操做通常都是影响到整个app的操做。
下图是3.0一下的Option Menu的样子:
android
这是3.0上的ActionBar的样子:app
固然除了上面提到的菜单面板,Android还提供了上下文菜单(Context menu)和弹出菜单(Popup Menu)。尽管存在三种不一样的菜单,可是Android提供了一个统一操做的API。ide
Android中的全部菜单项的布局文件都是在res/menu目录下定义的,布局文件并无和某一种菜单类型绑定,这就是为何前面说有统一操做的API。xml定义菜单的规则是:顶层元素必须是Menu;在Menu中能够放置item和group;item表示菜单中的一项;group能够包含多个item,其中的全部item都会共享某一些属性。item中又能够包含Menu项,这是嵌套菜单(多级菜单)。函数
前面已经说到,选项菜单在3.0先后版本存在一些差异。在Fragment和Activity中均可以建立选项菜单,系统会首先显示Activity中建立的item,而后按照fragment加入的顺序添加item。在3.0一下时,onCreateOptionsMenu是在点击菜单键时触发;在3.0以上,则是在Activity建立时就会调用。布局
响应点击事件,能够在onOptionsItemSelected中进行。注意这个事件处理函数须要返回一个boolean值。若是已经处理了此次点击须要返回true,不然直接调用super.onOptionsItemSelected()(返回fasle)。这个事件的处理流程是,事件先被送到Activity,而后按照先进先达的顺序,直至莫一个fragement处理了此次点击或者全部的fragment都已经遍历了。ui
能够在菜单的item中指定android:onClick
,这个点击事件的处理函数必须是Activity中签名为public 而且接受一个MenuItem的参数。code
更新菜单中的选项,咱们能够经过onCreateOptionsMenu来建立菜单项,可是若是想在运行时改变菜单中的选项,能够重写onPrepareOptionsMenu方法来实现。在3.0如下,这个方法会在菜单键每次按下的时候触发;在3.0以上,因为ActionBar是一直显示的,因此咱们若是须要改变菜单,能够主动调用invalidateOptionsMenu()
,而后系统会去走onPrepareOptionsMenu。xml
Contextual Menu主要多用于和界面特别是AdapterView中的某一个item进行交互,经过长按控件来呼出一个Action Menu。若是说Option menu(Actionbar)上面的菜单选项是针对整个app的范围,那么Contextual Menu从名字就能够看出来是针对当前context范围内的操做。存在两种方式:htm
下图左边是floating context Menu,右边是Contextual action mode
floating context menu是3.0一下版本建议使用的,针对当前Context的一个操做面板,经过长按指定控件呼出。长按事件若是也被监听,那么会先执行长按事件,再执行onContextItemSelected。若是长按事件处理返回true,那么context Menu不会被呼出:
一样须要注意的是在处理事件时,也是由Activity最早接收,而后按照加入顺序分发到每个Fragment。
从上图能够看到Contextual action和ActionBar很有几分类似,可是二者直接并没有直接关联。在3.0一下版本中,咱们须要使用support包中的兼容方案。
单个View使用步骤以下:
在AdapterView中使用,步骤以下:
API level 11加入。在android中还提供了一种用来相对于界面上已经存在的一个控件的菜单,好比相似于ActionBar上面的overflow。
使用Popup Menu的步骤以下:
须要注意的是PopupMenu弹出的位置是自适应的,主要看这个View在那个地方有空间,就会在哪一个方向上面弹出来。
选择菜单和前面所说起的菜单类型不一样,它仅仅是一种菜单项的表现形式。在本文以前说起的全部菜单中,每个菜单项的呈现方式都是简单的文字(或者icon),若是咱们要加入一种单选框或者复选框的效果,可使用item的checkable属性。效果以下图:
须要注意的是,在option Menu中,若是一个菜单项是以icon的方式显示出来,那么它将不会显示选择框。
咱们亦能够经过group来为一组item设置选择条件,这才是它原本的意义。android:checkableBehavior
能够设置成radio 或者checkbox或者none,默认应该是checkbox。
选择菜单项是不能保存状态的,若是app退出,下次再进入状态就不存在了。
若是咱们须要在菜单项中经过Intent启动另一个Activity,Menu提供了专门的类型来处理,这就是Intent Options。并且意图菜单项还能够在系统中解析这个Intent是否可以被Activity了解,若是系统中没有Activity可以接受这个Intent,那么这个意图菜单项将不会展现出来。使用步骤以下:
CATEGORY_ALTERNATIVE and/or CATEGORY_SELECTED_ALTERNATIVE
addIntentOptions方法返回增长的item数目,因此经过Intent解析的item都会被加入菜单中。这个菜单项的item title就是intent-filter的android:label,icon是application icon
感受这个东东和settings等系统模块同样,在中国开发者的眼中根本不会去用它,因此老外才会感叹中国作的app怎么这么难用,每一个应用的风格都不同。。。