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这个快捷菜单对象