Android应用程序----UI界面控件(菜单menu)

菜单是应用程序中非常重要的组成部分,能够在不占用界面空间的前提下,为应用程序提供了统一的功能和设置界面,并为程序开发人员提供了易于使用的编程接口

Android系统支持三种菜单

选项菜单(Option Menu)

子菜单(Submenu)

快捷菜单(Context Menu)

选项菜单 q选项菜单是一种经常被使用的Android系统菜单

打开方式:通过“菜单键”(MENU key)打开

选项菜单分类

图标菜单(Icon Menu)

扩展菜单(Expanded Menu)

选项菜单是一种经常被使用的Android系统菜单

打开方式:通过“菜单键”(MENU key)打开

选项菜单分类

图标菜单(Icon Menu)

扩展菜单(Expanded Menu)

图标菜单能够同时显示文字和图标的菜单,最多支持6个子项

图标菜单不支持单选框和复选框

扩展菜单是在图标菜单子项多余6个时才出现,通过点击图标菜单最后的子项“More”才能打开

扩展菜单是垂直的列表型菜单

不能够显示图标

支持单选框和复选框

重载Activity的onCreateOptionMenu()函数,才能够在Android应用程序中使用选项菜单

初次使用选项菜单时,会调用onCreateOptionMenu()函数,用来初始化菜单子项的相关内容

设置菜单子项自身的子项的ID和组ID

菜单子项显示的文字和图片等

第1行和第2行代码将菜单子项ID定义成静态常量,并使用静态常量Menu.FIRST(整数类型,值为1)定义第一个菜单子项,以后的菜单子项仅需在Menu.FIRST增加相应的数值即可

第7行代码是onCreateOptionsMenu()函数返回值,函数的返回值类型为布尔型 q返回true将显示在函数中设置的菜单,否则不能够显示菜单

第4行代码Menu对象作为一个参数被传递到函数内部,因此在onCreateOptionsMenu()函数中,用户可以使用Menu对象的add()函数添加菜单子项

add()函数的语法

第1个参数groupId是组ID,用以批量的对菜单子项进行处理和排序

第2关参数itemId是子项ID,是每一个菜单子项的唯一标识,通过子项ID使应用程序能够定位到用户所选择的菜单子项

第3个参数order是定义菜单子项在选项菜单中的排列顺序

第4个参数title是菜单子项所显示的标题

添加菜单子项的图标和快捷键:使用setIcon()函数和setShortcut()函数

MENU_DOWNLOAD菜单设置图标和快捷键的代码

第2行代码中使用了新的图像资源,用户将需要使用的图像文件拷贝到/res/drawable目录下

setShortcut()函数第一个参数是为数字键盘设定的快捷键

第二个参数是为全键盘设定的快捷键,且不区分字母的大小写

重载onPrepareOptionsMenu()函数,能够动态的添加、删除菜单子项,或修改菜单的标题、图标和可见性等内容

onPrepareOptionsMenu()函数的返回值的含义与onCreateOptionsMenu()函数相同

返回true则显示菜单

返回false则不显示菜单

下面的代码是在用户每次打开选项菜单时,在菜单子项中显示用户打开该子项的次数

第1行代码设置一个菜单子项的计数器,用来统计用户打开“上传设置”子项的次数

第4行代码是通过将菜单子项的ID传递给menu.findItem()函数,获取到菜单子项的对象

第5行代码是通过MenuItem的setTitle()函数修改菜单标题

onOptionsItemSelected ()函数能够处理菜单选择事件,且该函数在每次点击菜单子项时都会被调用

下面的代码说明了如何通过菜单子项的子项ID执行不同的操作

onOptionsItemSelected ()的返回值表示是否对菜单的选择事件进行处理

如果已经处理过则返回true,否则返回false

第2行的MenuItem.getItemId()函数可以获取到被选择菜单子项的ID

完整代码请参考OptionsMenu程序

程序运行后,通过点击“菜单键”可以调出程序设计的两个菜单子项

子菜单

子菜单是能够显示更加详细信息的菜单子项

菜单子项使用了浮动窗体的显示形式,能够更好适应小屏幕的显示方式

Android系统的子菜单使用非常灵活,可以在选项菜单或快捷菜单中使用子菜单,有利于将相同或相似的菜单子项组织在一起,便于显示和分类

子菜单不支持嵌套

子菜单的添加是使用addSubMenu()函数实现

第1行代码在onCreateOptionsMenu()函数传递的menu对象上调用addSubMenu()函数,在选项菜单中添加一个菜单子项,用户点击后可以打开子菜单

addSubMenu()函数与选项菜单中使用过的add()函数支持相同的参数,同样可以指定菜单子项的ID、组ID和标题等参数,并且能够通过setIcon()函数菜单所显示的图标

第2行代码使用setHeaderIcon ()函数,定义子菜单的图标

第3行定义子菜单的标题,若不规定子菜单的标题,子菜单将显示父菜单子项标题,即第1行代码中 “上传设置”

第4行和第5行在子菜单中添加了两个菜单子项,菜单子项的更新函数和选择事件处理函数,仍然使用onPrepareOptionsMenu()函数和onOptionsItemSelected ()函数

以上小节的代码为基础,将“上传设置”改为子菜单,并在子菜单中添加“上传参数A”和“上传参数B”两个菜单子项。完整代码请参考MySubMenu程序,运行结果如图

快捷菜单

快捷菜单同样采用了动窗体的显示方式,与子菜单的实现方式相同,但两种菜单的启动方式却截然不同

启动方式:快捷菜单类似于普通桌面程序中的“右键菜单”,当用户点击界面元素超过2秒后,将启动注册到该界面元素的快捷菜单

使用方法:与使用选项菜单的方法非常相似,需要重载onCreateContextMenu()函数和onContextItemSelected()函数

onCreateContextMenu()函数主要用来添加快捷菜单所显示的标题、图标和菜单子项等内容

选项菜单中的onCreateOptionsMenu()函数仅在选项菜单第一次启动时被调用一次

快捷菜单的onCreateContextMenu()函数每次启动时都会被调用一次

ContextMenu类支持add()函数(代码第7行)和addSubMenu()函数,可以在快捷菜单中添加菜单子项和子菜单

第5行代码的onCreateContextMenu()函数中的参数

第1个参数menu是需要显示的快捷菜单

第2个参数v是用户选择的界面元素

第3个参数menuInfo是所选择界面元素的额外信息

菜单选择事件的处理需要重载onContextItemSelected()函数,该函数在用户选择快捷菜单中的菜单子项后被调用,与onOptionsItemSelected ()函数的使用方法基本相同

使用registerForContextMenu()函数,将快捷菜单注册到界面控件上(下方代码第7行)。这样,用户在长时间点击该界面控件时,便会启动快捷菜单

为了能够在界面上直接显示用户所选择快捷菜单的菜单子项,在代码中引用了界面元素TextView(下方代码第6行),通过更改TextView的显示内容(上方代码第5、8和11行),显示用户所选择的菜单子项

下方代码是/src/layout/main.xml文件的部分内容,第1行声明了TextView的ID为label,在上方代码的第6行中,通过R.id.label将ID传递给findViewById()函数,这样用户便能够引用该界面元素,并能够修改该界面元素的显示内容

需要注意的一点,上方代码的第2行,将android:layout_width设置为fill_parent,这样TextView将填充满父节点的所有剩余屏幕空间,用户点击屏幕TextView下方任何位置都可以启动快捷菜单

如果将android:layout_width设置为wrap_content,则用户必须准确点击TextView才能启动快捷菜单

完整代码参考MyContextMenu程序,运行结果如图所示

在Android系统中,菜单不仅能够在代码中定义,而且可以像界面布局一样在XML文件中进行定义

使用XML文件定义界面菜单,将代码与界面设计分类,有助于简化代码的复杂程度,并且更有利于界面的可视化

下面将快捷菜的示例程序MyContextMen改用XML实现,新程序的工程名称为MyXLMContoxtMenu

首先需要创建保存菜单内容的XML文件 q在/src目录下建立子目录menu,并在menu下建立context_menu.xml文件,代码如下

在描述菜单的XML文件中,必须以<menu>标签(代码第1行)作为根节点,<item>标签(代码第2行)用来描述菜单中的子项,<item>标签可以通过嵌套实现子菜单的功能

XML菜单的显示结果如图所示

在XML文件中定义菜单后,在onCreateContextMenu()函数中调用inflater.inflate()方法,将XML资源文件传递给菜单对象

第4行代码中的getMenuInflater()为当前的Activity返回MenuInflater

第5行代码将XML资源文件R.menu.context_menu,传递给menu这个快捷菜单对象

(0)

相关推荐