天天看点

Android系列之UI组件----Menu菜单

【正文】

从官方文档了解到,从android3.0(api level 11)开始,android设备不再要求提供一个专门的菜单按钮,转而推荐使用actionbar。所以现在市面上很多新设备使用三个虚拟按键,并不再额外提供菜单按钮。

因为android版本的发展,对于菜单的支持各个版本有很大的区别,而android3.0是个分水岭,大概可以分为下面三类:

optionmenu和actionbar:一些操作的集合,如果开发的平台在android3.0之上,推荐使用actionbar,如果开发的平台在android2.3或之下,还是可以使用optionmenu的。

contextmenu和actionmode:contextmenu是一个浮动的窗口形式展现一个选项列表,actionmode是一个显示在屏幕顶部的操作栏,允许用户选择多个选项,actionmode在android3.0之后才有支持。

popup menu:popupmenu是固定在view上的模态菜单,以弹出的方式显示,在android3.0之后才有支持。

【在xml中定义一个菜单】

android提供了标准的xml格式的资源文件来定义菜单项,并且对所有菜单类型都支持,推荐使用xml资源文件来定义菜单,之后再把它inflater到activity或者fragment中,而不是在activity中使用代码声明。

而菜单的xml资源文件,需要创建在/res/menu/目录下,并且包含一下几个元素:

<menu>:定义一个menu,是一个菜单资源文件的根节点,里面可以包含一个或者多个<item>和<group>元素。

<item>:创建一个menuitem,代表了菜单中一个选项。

<group>:对菜单项进行分组,可以以组的形式操作菜单项。

<item>元素除了常规的id、icon、title属性的支持,还有一个重要的属性:android:showasaction,这个属性是起兼容性的,描述了在android的高版本中,菜单项何时以何种方式加入到actionbar中。

<group>是对菜单进行分组,分组后的菜单显示效果并没有区别,唯一的区别在于可以针对菜单组进行操作,这样对于分类的菜单项,操作起来更方便,提供如下的操作:

menu.setgroupcheckable():菜单组内的菜单是否都可选。

menu.setgroupvisible():是否隐藏菜单组的所有菜单。

menu.setgroupenabled():菜单组的菜单是否有用。

如果菜单项需要单选或者多选,可以使用android:checkablebehavior属性设置,它可以对单个<item>或者<group>设置一个组,这个属性接受三个参数:single,单选;all,多选,none,没有checked的选项,默认。

当创建好一个xml菜单资源文件之后,可以使用menuinflater.inflate()方法填充菜单资源,使xml资源变成一个可编程的对象。

一、options menu选项菜单:

optionmenu,选项菜单,单击手机上的菜单键(menu)出现,必须设备具有菜单按钮才可以触发。因为屏幕的限制,最多只能展示六个菜单项,如果定义的菜单项超出了六个,其他的菜单项将被隐藏,第六个菜单将会显示“更多”,点击展开更多的菜单。虽说在android3.0之后不再推荐使用选项菜单,但是如果使用了,在android3.0之后的设备上,选项菜单项将被默认转移到actionbar中,这个可以通过android:showasaction属性控制。

创建选项菜单的核心步骤:

(1)重写activity的oncreateoptionmenu(menu menu)方法,当菜单第一次被加载时调用

(2)调用menu 的add( )方法添加菜单项(menuitem),同时可以调用menuitem的seticon()方法为菜单项设置图标(注:android 3.0之后,即使添加了图标也不会显示)

(3)重写activity的optionsitemselected(menuitem item)来响应菜单项(menuitem)的点击事件

来看一下具体的代码实现:

新建android工程menutest:

【方式一】通过配置文件添加menu选项

(1)在res/menu/main.xml中定义菜单项。main.xml的代码如下:

Android系列之UI组件----Menu菜单
Android系列之UI组件----Menu菜单

注:第9行和第15行的字符串引用,需要提前在strings.xml文件中设置好。

(2)mainactivity.java:

Android系列之UI组件----Menu菜单
Android系列之UI组件----Menu菜单

核心代码是第24行:引用布局文件menu.xml,然后在30行的方法中添加menuitem的点击事件。

运行程序,效果如下:

Android系列之UI组件----Menu菜单
Android系列之UI组件----Menu菜单

如果想让menuitem变成actionbar的形式,可以修改res/menu/main.xml中的android:showasaction属性,它的属性值一共有下面几种:

Android系列之UI组件----Menu菜单

其中,ifroom表示:如果有空间,就显示出来。withtext表示:只显示文本(如果配了图标的话)。如果将属性设置为always,效果如下:

Android系列之UI组件----Menu菜单

如果需要添加子菜单,可以修改menu.xml文件为如下所示:

Android系列之UI组件----Menu菜单
Android系列之UI组件----Menu菜单

于是,子菜单的点击事件为:

Android系列之UI组件----Menu菜单
Android系列之UI组件----Menu菜单

运行效果如下:

Android系列之UI组件----Menu菜单

【方式二】通过java代码添加menu选项:

当然了,上方的方式一是通过xml文件来添加menu选项的,下面我们通过java代码来添加menu选项(此时已经不需要menu.xml文件了)。修改mainactivity.java,代码如下: 

mainactivity.java:

Android系列之UI组件----Menu菜单
Android系列之UI组件----Menu菜单

注意第35行对各个参数的解释。

运行程序,效果和上方gif图的效果是一样的。

总结:推荐用方式1来做。

二、context menu:上下文菜单

顾名思义 与上下文(环境)有关。操作时需要长时间按住某个item不放,就会弹出context menu。效果如下:

Android系列之UI组件----Menu菜单

创建上下文菜单的核心步骤:

(1)覆盖activity的oncreatecontextmenu(menu menu)方法,调用menu的add()方法添加菜单项(menuitem)

(2)覆盖activity的oncontextitemselected(menuitem iitem)来响应事件

(3)调用registerforcontextmenu()方法来为视图注册上下文菜单。

现在通过代码来实现。

重新建一个android工程menutest02,步骤如下:

我们现在activity_main.xml中添加一个按钮button1,代码就不写了。然后继续:

Android系列之UI组件----Menu菜单
Android系列之UI组件----Menu菜单

(2)mainactivity.java:

Android系列之UI组件----Menu菜单
Android系列之UI组件----Menu菜单

核心代码是第22行:为按钮button1绑定上下文菜单。注意不是绑定监听器哦,不要一看到按钮就绑定监听器哈。

注:一个界面中只能有一个上下文菜单。

运行程序,长按button,效果如下:

Android系列之UI组件----Menu菜单

注:如果是在java代码中添加menu,用参数menu来天添加就行了。

三、popup menu:弹出式菜单

 popupmenu,弹出菜单,一个模态形式展示的弹出风格的菜单,绑在在某个view上,一般出现在被绑定的view的下方(如果下方有空间)。

注意:弹出菜单是在api 11和更高版本上才有效的。

核心步骤:

(1)通过popupmenu的构造函数实例化一个popupmenu对象,需要传递一个当前上下文对象以及绑定的view。

(2)调用popupmenu.setonmenuitemclicklistener()设置一个popupmenu选项的选中事件。

(3)使用menuinflater.inflate()方法加载一个xml文件到popupmenu.getmenu()中。

(4)在需要的时候调用popupmenu.show()方法显示。

现在通过代码来实现。重新新建一个工程文件menutest03。步骤如下:

先在布局文件activity_main.xml中加一个按钮,代码略。

Android系列之UI组件----Menu菜单
Android系列之UI组件----Menu菜单

(2)mainactivity.java:

Android系列之UI组件----Menu菜单
Android系列之UI组件----Menu菜单

注意14行代码绑定了两个监听器:onclicklistener和onmenuitemclicklistener。 在绑定onmenuitemclicklistener监听器时,选的是下面这个:

Android系列之UI组件----Menu菜单

如果是在api 14及以上版本,32行34行可以合并为:popup.inflate(r.menu.main, popup.getmenu());

注意第37行代码不要忘记show。

运行程序,单击button,效果如下:

Android系列之UI组件----Menu菜单

继续阅读