对菜单的学习
Android有三种基本的菜单类型
●选项菜单OptionsMenu:Activity的主菜单项集合,一般放置对应用有全局影响的操作,如“搜索”“设置”等。
●上下文菜单ContextMenu:用户长按某元素时出现的浮动菜单,菜单提供的操作仅影响所选内容或上下文。
●弹出菜单PopupMenu:以垂直列表形式显示一系列菜单项,并且该列表会固定在调用该菜单的视图中,它适用于提供与特定内容相关的操作,如Activity的内容区域相关的扩展操作。
使用XML定义菜单
针对这三种类型的菜单,Android都提供了标准的XML格式定义菜单及其所有项
XML方式的优点:
●XML方式可以可视化菜单结构。
●菜单内容与应用的逻辑代码分离。
在res目录上右击选择AndroidResourceFile,打开NewResourceFile对话框,创建Resourcetype为menu的XML文件,该菜单文件的构成元素包括:<menu>、<item>、<group>。
● <menu>:菜单根节点,能够包含一个或多个<item>和<group>元素,它是定义菜单项的容器。
● <item>:菜单项节点,用于创建MenuItem对象,可包含嵌套<menu>元素,以便创建子菜单。
● <group>:用于对菜单项进行分类,它是<item>元素的不可见容器。
XML菜单文件的示例代码如下:
<item>元素的常用属性
●android:id:设置菜单项的id,用于识别该菜单项。
● android:icon:设置菜单项的图标,Android3.0之后折叠菜单默认不显示图标。
●android:title:设置菜单项的标题字符串。
● android:showAsAction:指定菜单项在标题栏的显示的时机和方式,菜单项只有在Activity 包含应用栏时才能显示为操作项。取值说明如表所示。
取值 | 说明 |
---|---|
ifRoom | 只有在标题栏中有空间时才将此项放置其中。如果没有足够的空间容纳标记为ifRoom的所有项,标题栏显示不了的菜单项将显示在溢出 |
withText | 菜单项的文本和图标一起显示,可以将此值与其他值用竖线( |
never | 菜单项永远不显示在标题栏,而隐藏在溢出菜单中 |
always | 始终将此菜单项显示在标题栏。除非必须始终显示在标题栏,否则不要使用该值 |
collapseActionView | 将菜单项折叠到一个按钮中,选择按钮展开,一般与ifRoom一起使用 |
菜单项的图标通过ImageAsset工具进行创建
选项菜单option_menu.xml:
上下文菜单context_menu.xml:
弹出菜单popup_menu.xml:
选项菜单
每个Activity默认都自带选项菜单,只需要添加菜单项,响应菜单项的单击事件。
android.view.Menu接口表示菜单
android.view.MenuItem接口表示菜单项
android.view.SubMenu接口表示子菜单
1.Activity通过重写OnCreateOptionsMenu()方法加载创建的XML菜单资源,在此方法中使用MenuInflater类的inflate()方法将XML资源加载到Menu对象。
2.使用add()添加菜单项,该方法有4个参数,分别为:菜单项的组别id、菜单项id、排列顺序及菜单项标题,菜单项的图标设置可以调用setIcon()来实现
当用户从选项菜单中选择菜单项时,系统将调用onOptionsItemSelected(),此方法将传递所选的MenuItem对象,通过调用该MenuItem对象的getItemId()方法获取菜单项的id
选项菜单的运行效果。
默认情况下,即便在菜单XML文件中定义了android:icon属性,在溢出菜单中图标也不会显示,可以使用反射的方法获取Menu对象的setOptionalIconsVisible(),调用该方法显示图标icon
然后将此方法添加到onCreateOptionsMenu()方法的return语句之前
上下文菜单
当用户长按某一控件时出现的浮动菜单称为上下文菜单。上下文菜单不同于选项菜单,选项菜单服务于Activity,而上下文菜单则注册在某个View对象上。它通常应用于列表中的每一项元素,如:长按列表项弹出删除对话框。
Android提供了两种上下文操作菜单的方法。
●使用浮动上下文菜单,如图2.30所示,当长按某个View时,显示为菜单项的浮动列表。
●使用上下文操作模式,如图2.31所示,它在屏幕顶部栏显示上下文操作栏选项。
1.创建浮动上下文菜单操作步骤
(1)注册菜单
通过调用registerForContextMenu(View view)注册与上下文菜单关联的View。如果将ListView或GridView作为参数传入,那么每个列表项将会有相同的浮动上下文菜单。
(2)加载菜单资源
在Activity或Fragment中实现onCreateContextMenu(),动态加载Menu资源。当注册后的View收到长按事件时,系统将调用此方法。
(3)处理菜单项单击事件
在Activity或Fragment中实现onContextItemSelected(),实现菜单项的单击逻辑。
上下文操作模式是ActionMode对象的系统实现,当用户长按控件或选中复选框等组件时调用此模式,会在屏幕顶部出现上下文操作栏,显示用户对所选控件执行的操作。
2.建上下文操作栏模式的上下文菜单操作步骤
(1)实现ActionMode.Callback接口
在该接口的回调方法中,为上下文操作栏指定操作、响应菜单项的单击事件等。
该接口的回调方法与选项菜单的回调方法基本相同,只是需要传递与事件相关联的ActionMode对象。onActionItemClicked()方法用于处理菜单项的单击事件,与onContextItem- Selected()类似。当系统销毁操作模式时,需要在onDestroyActionMode()方法中将actionMode变量设置为null。
(2)启动上下文操作模式在用户名的EditView控件的长按事件中调用startActionMode()启动上下文操作模式
调用startActionMode()方法返回ActionMode对象,通过该对象响应上下文操作栏的事件。
弹出菜单
弹出菜单PopMenu以垂直列表形式显示一系列操作选项,一般由控件元素触发,弹出菜单将显示在对应控件的上方或下方
弹出菜单适用于:
●为与特定内容密切相关的操作提供溢出式菜单;
●提供类似Spinner控件,但不保留永久选择的下拉菜单。
使用弹出菜单的步骤
(1)创建菜单资源文件
在res/menu目录中创建PopupMenu的XML资源文件。
(2)创建并加载弹出菜单
在EditText控件的单击事件onClick()方法中实例化PopupMenu对象,传递当前上下文对象及绑定的View对象,然后调用MenuInflater.inflate()方法加载菜单XML文件,调用PopupMenu的setOnMenuItemClickListener()设置单击菜单项的事件监听器,最后调用show()方法显示菜单。
(3)处理菜单项的OnMenuItemClick事件
MainActivity类实现PopupMenu.OnMenuItemClickListener接口,重写onMenuItemClick()回调方法,当用户选择菜单项时,系统调用onMenuItemClick()进行处理。