下面是适用于大多数菜单项的一些其他的特性。
菜单组Menu groups
当往菜单中添加新项时,你可以选择把它包含在一个组中。一个菜单组是一些可以共享某些特征的菜单项的集合,比如它们是否可见,是否可用,或者可否复选(checkable)。
一个组由一个整数定义(或者一个XML里的资源ID)。当我们使用接受一个groupId参数的add()方法,比如add(int, int, int, int)添加项时,它将被添加到组中。
你可以通过setGroupVisible()显示或隐藏菜单组;通过启用或禁用这个组;以及通过setGroupCheckable()设置菜单项是否可以复选。
可复选菜单项Checkable menu items
任何菜单项可以被用来表示选项开关的接口。这可以通过一个checkbox来指示一个单独的选项,或者通过一组单选按钮来表示互斥选项。(查看右边的截屏)。
注意: 在图标菜单中的菜单项不能显示复选框或单选按钮。如果你选择让图标按钮中的菜单项变成可复选,那你必须在开关状态变化时自动通过切换图标和文本来指示这个状态。
要让一个单独的项变成可复选,使用 setCheckable() 方法,如下:
menu.add(0, VIBRATE_SETTING_ID, 0, "Vibrate")
.setCheckable(true);
这将为这个菜单项显示一个复选框(除非这是个图标菜单)。当这个item被选中时,通常onOptionsItemSelected()
会被调用。你应该在这里设置复选框状态。你可以用isChecked()来查询这个菜单项的当前状态和用setChecked()来设置复选状态。就像下面一样:
switch (item.getItemId()) {
case VIBRATE_SETTING_ID:
if (item.isChecked()) item.setChecked(false);
else item.setChecked(true);
return true;
...
}
为了创建一组互斥的单选按钮,只要简单的为每个菜单项分配相同的group ID并调用setGroupCheckable()。在这个例子里,你不需要为每个菜单项调用setCheckable()
方法,因为这个组被整体上设置为可复选。下面是在一个子菜单中创建两个互斥选项的例子:
SubMenu subMenu = menu.addSubMenu("Color");
subMenu.add(COLOR_MENU_GROUP, COLOR_RED_ID, 0, "Red");
subMenu.add(COLOR_MENU_GROUP, COLOR_BLUE_ID, 0, "Blue");
subMenu.setGroupCheckable(COLOR_MENU_GROUP, true, true);
在setGroupCheckable()
方法里,第一个参数是我们想设置为可复选的group ID。第二个参数表示是否设置为可复选。最后一个参数代表这些菜单项是否互斥(如果设置为false,则所有的菜单项将会是复选框而不是单选按钮。当这个组设置为互斥时(单选按钮),每当一个新的项被选中时,所有其它的项的选择会自动被清除。
快捷键Shortcut keys
可以为菜单项添加字母或数字快捷键,setAlphabeticShortcut(char)
方法(设置字母快捷键),setNumericShortcut(int)
方法(设置数字快捷键),或者 setShortcut(char,int)
(同时设置字母和数字)。非大小写敏感,比如:
menu.add(0, MENU_QUIT, 0, "Quit")
.setAlphabeticShortcut('q');
现在,当菜单打开时(或者按住菜单键),按”q”键将选择该菜单项。
这个快捷键将以菜单项的提示信息而显示在菜单项名称的下面(除了图标菜单项)。
菜单项意图Menu item intents
如果你已经阅读过应用程序基础Application Fundamentals,那么你应该多少知道一点Android意图。它允许程序互相绑定,分享信息,以及合作执行用户任务。就像你的应用程序可以发送一个意图来启动浏览器,邮件客户端或者另外一个活动一样,你可以从菜单中执行这样的动作。有两种途径来做这件事:定义一个意图然后分配给一个单独的菜单项,或者定义一个意图并允许Android查找设备上的活动然后动态的为每个符合意图标准的活动添加一个菜单项。
请阅读意图和意图过滤器章节,以获取更多关于意图创建和应用程序提供服务方面的信息。
为一个单独的菜单项设置一个意图Set an intent for a single menu item
如果你想提供一个具体的菜单项来启动一个新的活动,那么你可以通过setIntent()方法具体地为这个菜单项定义一个意图。
比如,在onCreateOptionsMenu() 方法里,你可以用一个意图定义一个新菜单项如下:
MenuItem menuItem = menu.add(0, PHOTO_PICKER_ID, 0, "Select Photo");
menuItem.setIntent(new Intent(this, PhotoPicker.class));
当这个菜单项被选中时,Android将自动启动这个活动。
注意: 这并不会给你的活动返回一个结果。如果你希望返回一个结果,那么不要使用setIntent()
。相反,和通常情况一样在onOptionsMenuItemSelected()
or onContextMenuItemSelected()
回调中处理并调用startActivityForResult().
动态添加意图Dynamically add intents
如果有潜在的多个活动和你的当前活动或所选择菜单项相关,那么这个应用程序可以动态添加菜单项来执行其他的服务。
在菜单创建过程中,定义一个意图,使用Intent.ALTERNATIVE_CATEGORY和/或 Intent.SELECTED_ALTERNATIVE类别,当前选择(如果有的话)的MIME类型,以及其他需求,和你打开一个新活动时想要满足一个意图过滤器一样。然后调用addIntentOptions() 来让Android查找任何满足那些需求的服务并为你添加它们到菜单中。如果已安装的程序没有满足这个意图的,那么将不会有额外的菜单项被添加。
注意: SELECTED_ALTERNATIVE 是用来处理屏幕当前选中元素的。所以,它应该仅当在onCreateContextMenu()
或 onPrepareOptionsMenu()
里面创建菜单项时使用, 后者每次打开选项菜单时会被调用。
下面是一个说明应用程序如何搜索附加服务来显示在它的菜单中的例子。
public boolean onCreateOptionsMenu(Menu menu){
super.onCreateOptionsMenu(menu);
// Create an Intent that describes the requirements to fulfill, to be included
// in our menu. The offering app must include a category value of Intent.CATEGORY_ALTERNATIVE.
Intent intent = new Intent(null, getIntent().getData());
intent.addCategory(Intent.CATEGORY_ALTERNATIVE);
// Search for, and populate the menu with, acceptable offering applications.
menu.addIntentOptions(
thisClass.INTENT_OPTIONS, // Menu group
0, // Unique item ID (none)
0, // Order for the items (none)
this.getComponentName(), // The current Activity name
null, // Specific items to place first (none)
intent, // Intent created above that describes our requirements
0, // Additional flags to control items (none)
null); // Array of MenuItems that corrolate to specific items (none)
return true;
}
对于每个活动,如果其意图过滤器匹配我们所定义的那个意图,则将会添加一个菜单项,使用这个意图过滤器的android:label值作为菜单项的文本。这个addIntentOptions() 方法也会返回所增加菜单项的数目。
请同时注意,当addIntentOptions()
被调用时,它将重写第一个参数指定的所有菜单组里的菜单项。
如果想把你的活动的服务提供给其他应用程序菜单,那么你只需要和通常情况一样定义一个意图过滤器。只是需要确保在一个意图过滤器的<category>
元素的name属性中包含ALTERNATIVE 和/或 SELECTED_ALTERNATIVE值。比如:
<intent-filter label="Resize Image">
...
<category android:name="android.intent.category.ALTERNATIVE" />
<category android:name="android.intent.category.SELECTED_ALTERNATIVE" />
...
</intent-filter>
在意图和意图过滤器文章中有更多关于创建意图过滤器的描述。
要了解使用该技术的一个例子应用程序,可查看NotePad范例代码。
分享到:
相关推荐
用户界面User Interface 24 视图层次View Hierarchy 24 布局Layout 25 部件Widgets 26 用户界面事件UI Events 26 菜单Menus 26 高级话题Advanced Topics 27 适配器Adapter 27 风格与主题Styles and Themes 27 资源和...
第四讲:用户界面开发 第五讲:控件 第六讲:菜单 第七讲:数据存储 第八讲:服务 第九讲:多媒体开发 第十讲:2D游戏开发 第十一讲:HTML5与web移动开发 第十二讲:输入法 第十三讲:OPENGL ES 第十四讲:DNK编程 ...
◆高级开发主题,包括安全、ipc以及一些高级图形和用户界面技术 读者对象 本书面向希望在android手机平台上创建应用程序的所有人员。不管是经验丰富的移动开发人员,还是初出茅庐的新手,都能从本书提供的宝贵...
android用户界面之菜单(Menu)教程实例汇总 android用户界面之Layout(布局)教程汇总 android用户界面之Checkbox教程实例汇总 Android Wifi方法大全【总有一种方法适合你】 android开发环境搭建篇详尽的教程实例汇 ...
Android Android开发指南中文版 本PDF是Android开发指南的中文版,介绍了应用基础,视图层次,布局,邮件,用户界面事件,菜单,高级话题,资源和资产,意图和意图过滤器,数据存储,内容提供器,简单文件等知识
Android开发指南中文版 目录 应用程序基础Application Fundamentals................................ 4 关键类................................................................ 4 应用程序组件..................
第二部分 基础篇,包括第3章~第16章,第3章 Android程序设计基础、第4章 用户界面开发基础、第5章 控件(Widget)详解、第6章 菜单、第7章 信息提醒(对话框、Toast与Notification)、第8章 数据存储、第9章 Android...
第4章 我的UI我做主 用户界面开发基础 第5章 良好的学习开端 控件 Widget 详解 第6章 友好的菜单 Menu介绍与实例 第7章 友好地互动交流 信息提醒 对话框 Toast与Notification 第8章 移动的信息仓库 数据存储 第9章 ...
, 第二部分 基础篇,包括第3章~第16章,第3章 Android程序设计基础、第4章 用户界面开发基础、第5章 控件(Widget)详解、第6章 菜单、第7章 信息提醒(对话框、Toast与Notification)、第8章 数据存储、第9章 ...
用户界面User Interface ........................................................................................ 25 视图层次View Hierarchy .................................................................
本书内容上涵盖了用android开发的大部分场景,从android基础介绍、环境搭建、sdk介绍、market使用,到应用剖析、组件介绍、实例演示等方面。从技术实现上,讲解了5个android平台下的完整综合实例及源代码分析,...
我为Google / Udacity的“关联Android开发人员快速通道”课程中的第二个项目提交的内容。 共同项目要求 符合规格: 应用程序仅使用Java编程语言编写。 App符合Android Nanodegree一般项目指南中的通用标准。 用户...
第一讲:Android开发环境的搭建 第二讲:Android系统构架分析和应用程序目录结构分析 第三讲:Android模拟器的使用 emulator 第四讲:Activity入门指南 Activity 第五讲:用户界面 View(一) FrameLayout, ...
本文提供的信息能帮助你为应用的用户界面的各个部分创建的图标与Android2.X 框架 的一般样式相匹配。以下的指南将帮助你创建一个完美而且统一的用户体验。 下面文档讨论关于Android 应用程序常见类型图标的使用详细...
本书涵盖了Android应用程序开发的所有基础,包括用户界面、网络、SMS消息传递、数据库、基于位置的服务和部署等。资深作者Wei-Meng Lee为您铺就了一条成功开发和部署Android应用程序的康庄大道。 主要内容 ◆ 讨论...
通过逐渐在游戏中添加特性,你将学习Android编程的许多方面,包括用户界面、多媒体和Android生命周期。.. 第一部分中将首先介绍Android,内容涉及如何安装Android模拟器,如何使用IDE(Intergrated Development ...