Android开发指南-用户界面-创建菜单 .
2011-11-28 13:58
260 查看
创建菜单CreatingMenus
菜单是任何应用程序的一个重要部分,提供了透露应用程序功能和设置的通用接口。Android为开发者提供了一个简单的编程接口来实现各种条件下的标准化应用程序菜单。Android提供了三种基础菜单类型:
选项菜单OptionsMenu
这是一个活动的主菜单。通过按下设备菜单键来显示它。选项菜单包含两组菜单项:
图标菜单IconMenu
这个是当用户按下菜单键时最初出现屏幕下方的item集合。它支持最多6个菜单项。只有这些菜单支持图标而且这些菜单并不支持checkboxes或者radiobuttons。
扩展菜单ExpandedMenu
这是通过按“更多”菜单显现出来的一个竖向的项目列表。它仅当图标菜单过多时存在而且是由6个以及其它选项菜单组成。
上下文菜单ContextMenu
这是一个浮动菜单列表,通常在你长时间按在一个视图上时出现(比如一个列表项)
子菜单Submenu
这是一个浮动菜单列表,通过在选项菜单或上下文菜单选择菜单项显露出来。不支持嵌套子菜单。
选项菜单OptionsMenu
这个选项菜单通过按设备菜单键打开。打开后,出现图标菜单,可包含6个菜单项。如果添加多于6个菜单项,多出的部分将通过“更多”菜单项在扩展菜单中显示。扩展菜单项在多于6个菜单项时自动添加。
选项菜单应该包含应用程序的基本功能以及任何必要的浏览项(例如,返回桌面或应用程序设置)。你还可以通过增加子菜单
当菜单第一次被打开时,系统会调用活动
有多个
当一个菜单项从选项菜单中被选择时,你会接收到一个
MenuItem
。你可以通过请求itemId:
add()方法分配的整数。一旦你识别了这个菜单项,就可以采取合适的动作。
下面是一个活动里的例子,其中我们创建了一个选项菜单并处理菜单项的选择:
/*Createsthemenuitems*/
publicbooleanonCreateOptionsMenu(Menumenu){
menu.add(0,MENU_NEW_GAME,0,"NewGame");
menu.add(0,MENU_QUIT,0,"Quit");
returntrue;
}
/*Handlesitemselections*/
publicbooleanonOptionsItemSelected(MenuItemitem){
switch(item.getItemId()){
caseMENU_NEW_GAME:
newGame();
returntrue;
caseMENU_QUIT:
quit();
returntrue;
}
returnfalse;
}
这个
add()方法有四个参数:groupId,itemId,order,和
title。groupId允许你关联这个菜单到一个菜单组中(更多参见下面的菜单组
提示:如果你有一些可以以一个标题归类的菜单项,考虑以子菜单
增加图标Addingicons
图标也可以通过
menu.add(0,MENU_QUIT,0,"Quit")
.setIcon(R.drawable.menu_quit_icon);
修改菜单Modifyingthemenu
如果有些时候你想在选项菜单被打开的时候re-write它,可以override
onPrepareOptionsMenu()方法,该方法在每一次菜单被打开的时候调用。它将传递给你菜单对象,就像回调一样。这对于根据应用程序状态调整菜单选项很有用。
注意:当改变菜单项时,根据当前选择的item来这样做是一个不好的行为。记住,在触摸模式中,将不会有一个选择或聚焦的item。相反,当你想基于UI中的某个特定item来提供功能时,你应该使用一个
上下文菜单ContextMenu
Android的上下文菜单在概念上和PC软件的右键菜单类似。当一个视图注册到一个上下文菜单时,执行一个在该对象上的“长按”(按住不动差不多两秒钟)动作,将出现一个提供相关功能的浮动菜单。上下文菜单可以被注册到任何视图对象中,不过,最常见的是用于列表视图
(电话联系人列表提供了关于这个特性的一个很好的例子)。
注意:上下文菜单项不支持图标或快捷键。
为了创建一个上下文菜单,你必须重写这个活动的上下文菜单回调函数:
和
onCreateContextMenu()里,你可以通过使用一个
比如,下面的代码可以被用到Notepad应用程序中来为列表中的每一个注释添加一个上下文菜单:
publicvoidonCreateContextMenu(ContextMenumenu,Viewv,
ContextMenuInfomenuInfo){
super.onCreateContextMenu(menu,v,menuInfo);
menu.add(0,EDIT_ID,0,"Edit");
menu.add(0,DELETE_ID,0,"Delete");
}
publicbooleanonContextItemSelected(MenuItemitem){
AdapterContextMenuInfoinfo=(AdapterContextMenuInfo)item.getMenuInfo();
switch(item.getItemId()){
caseEDIT_ID:
editNote(info.id);
returntrue;
caseDELETE_ID:
deleteNote(info.id);
returntrue;
default:
returnsuper.onContextItemSelected(item);
}
}
在
onCreateContextMenu()中,除了给出将添加MenuItems的ContextMenu外,还需要给定选中的视图和一个上下文菜单信息
onCreateContextMenu()没做什么特别的事-只是添加了一些菜单项。在
onContextItemSelected()
回调函数中,我们从MenuItem中请求
AdapterContextMenuInfo.info字段来找到该ID。这个ID被传递给
editNote()
和
deleteNote()方法来执行相应的动作。
现在,要为一个列表视图中的所有项注册上下文菜单,我们可以传递整个的列表视图对象给
registerForContextMenu(getListView());
记住,你可以传递任何视图对象来注册一个上下文菜单。这里,
子菜单Submenus
一个子菜单可以被添加进任何菜单中,但不能加入另外的子菜单中。当你的应用程序有很多功能可以按主题组织的时候,这将非常有用,就好比PC应用程序的菜单栏(文件,编辑,视图,等)。
子菜单通过
publicbooleanonCreateOptionsMenu(Menumenu){
booleanresult=super.onCreateOptionsMenu(menu);
SubMenufileMenu=menu.addSubMenu("File");
SubMenueditMenu=menu.addSubMenu("Edit");
fileMenu.add("new");
fileMenu.add("open");
fileMenu.add("save");
editMenu.add("undo");
editMenu.add("redo");
returnresult;
}
子菜单中选择项的回调动作将由父菜单的回调方法处理。比如上面的例子,子菜单中的选择将由
onOptionsItemSelected()回调处理。
你也可以在XML中定义父菜单时增加子菜单。
在XML里定义菜单DefineMenusinXML
就像Android用户界面布局一样,你可以在XML文件中定义菜单,然后在你菜单的
onCreate...()回调函数中扩充它们。这使得你的应用程序代码简洁而且把更多的界面设计分离到XML文件中,这更容易形象化。
首先,在你的工程
res/的目录下创建一个新的目录叫
menu。你所有定义应用程序菜单的XML文件都应该放在这里。
在一个菜单XML布局中,有三个合法的元素:
<menu>,
<group>和
<item>。
item和
group必须是菜单的子元素,而
item元素还可以是
group的子元素,并且另外一个菜单元素可以是一个
item的子元素(来创建一个子菜单)。当然,任何文件的根元素必须是一个
menu元素。
作为一个例子,我们将定义和在上面的选项菜单
res/menu/里创建一个名为
options_menu.xml的文件。
<menuxmlns:android="http://schemas.android.com/apk/res/android">
<itemandroid:id="@+id/new_game"
android:title="NewGame"/>
<itemandroid:id="@+id/quit"
android:title="Quit"/>
</menu>
然后,在
onCreateOptionsMenu()方法里,我们通过
publicbooleanonCreateOptionsMenu(Menumenu){
MenuInflaterinflater=getMenuInflater();
inflater.inflate(R.menu.options_menu,menu);
returntrue;
}
尽管和在
onCreateOptionsMenu()创建菜单比较起来,上面的例子看起来做了更多的事情,但是如果处理更多的菜单项,这将省掉很多麻烦并让你的代码简洁。
你可以通过把
item元素打包进一个
group中来定义菜单组
item中嵌入另外一个
menu来创建子菜单。每个元素都支持必需的属性来控制快捷键,复选框,图标,以及更多特性。
要了解这些属性和更多的XML语法,请参见可用资源类型
相关文章推荐
- Android开发指南-用户界面-创建菜单
- Android开发指南-用户界面-创建菜单
- Android开发指南-用户界面-创建自定义组件
- Android开发指南-用户界面-菜单特性
- Android开发指南-用户界面-菜单特性
- Android开发指南-用户界面-创建自定义组件
- Android开发指南-用户界面-菜单特性
- Android开发指南-用户界面-创建自定义组件
- Android开发指南 2──用户界面
- 步步为营_Android开发课[20]_用户界面之Menu(菜单)
- Android开发指南-用户界面-对话框
- Android开发指南-用户界面-风格和主题
- Android开发指南-用户界面-事件处理
- Android开发指南-用户界面-用户通知
- Android用户界面-创建菜单
- Android开发指南-用户界面-通用布局对象
- Android开发指南-用户界面-风格和主题
- Android开发指南-用户界面-用户通知
- Android开发指南-用户界面-事件处理
- Android开发指南-用户界面-事件处理