打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
《Android Dev Guide》系列教程10:用户界面之创建菜单

《Android Dev Guide》系列教程10:用户界面之创建菜单

分类: Android Application 1156人阅读 评论(0) 收藏 举报

《Android Dev Guide》系列教程10:用户界面之创建菜单

懒骨头(http://blog.csdn.com/iamlazybone

 

创建菜单

 

菜单是应用程序重要的组成成分。他提供相似的借口来提供功能和设置。android为开发者提供一个简单的编程借口,针对不同的情况提供标准的程序菜单。

android 提供三种基本的menu类型:

Options Menu

这是一个菜单的基本元素。通过按menu的屏幕键才显示。有两种类型的menu菜单:

Icon Menu

通过按下menu键会出现这些可见按钮的集合。最大可以支持6个选项。只能显示为图标,并且菜单项只能为按钮,不能是选择框。

Expanded Menu

Icon menu有一个more选项,有一个选项集。只有当 Icon Menu 菜单被重写,并且有超过六个的选项时才会被显示。

Context Menu

这个菜单会在你长时间按view时显示。

Submenu

这是一个子菜单,可以添加到 Options Menu 或 Context Menu 菜单的选项中,子菜单不支持嵌套使用。


Options Menu

 

选项菜单通过按下menu键来显示。当菜单打开时,只显示前六个选项,如果超过六个,多的部分会显示在more里。超过的选项被添加到more菜单里是系统自动添加的。

选项菜单可以包含一些基本的程序功能,或者必要的导航。比如从主界面转到设置界面。你可以添加Submenus 来配置你的显示项,让它包含更多的功能。

当menu第一次被创建时,android系统会调用activity的onCreateOptionsMenu()回调方法。要添加自己的menu只需要重写它即可。你可以在弹出的menu中包含着在xml中定义的资源。或者通过调用add()方法添加每一个选项。这个方法会添加一个MenuItem,并且返回你最新创建的对象。你可以使用它们来获得菜单项,然后添加一些额外的属性,比如设置icon、快捷键等。

有很多种的add()方法,通常用的是能接收一个itemid参数的那个,这个id可以让你识别回调方法。

当一个菜单项从菜单中被选中,你会接收一个回调方法onOptionItemSelected()。这个回调方法会传递你所点击的菜单项,可以通过传来的id来判断是哪个菜单项。一旦你定义了菜单项,就可以添加适当的处理时间处理方法。

这里有一断activity中的代码,你可以这样定义并且处理他们的选择事件:

  1. /* Creates the menu items */  
  2. public boolean onCreateOptionsMenu(Menu menu) {  
  3.     menu.add(0, MENU_NEW_GAME, 0"New Game");  
  4.     menu.add(0, MENU_QUIT, 0"Quit");  
  5.     return true;  
  6. }  
  7. /* Handles item selections */  
  8. public boolean onOptionsItemSelected(MenuItem item) {  
  9.     switch (item.getItemId()) {  
  10.     case MENU_NEW_GAME:  
  11.         newGame();  
  12.         return true;  
  13.     case MENU_QUIT:  
  14.         quit();  
  15.         return true;  
  16.     }  
  17.     return false;  
  18. }  
 

在这个例子中使用的add()方法有四个参数:groupId、itemId、 order 和 title。groupId允许你将要添加的条目添加到groupId躲在项里。这个例子里,我们没有设置。itemid 是我们给MenuItem的唯一的整型值,可以用在在回调方法中识别选中项。order允许我们自定义item显示的顺序,默认情况下按照添加的顺序显示。title,就是显示的标签名,你可以用String resource字符串资源的方式来添加,这有有助于本地化的修改。

如果你想把几个菜单项合成一组,你可以用Submenu来实现。

 

添加图标 Adding icons

Icons可以通过setIcon()方法来添加。例如
menu.add(0, MENU_QUIT, 0, "Quit").setIcon(R.drawable.menu_quit_icon);

 

修改菜单 Modifying the menu

如果你想在菜单被添加之后修改它,可以重写onPrepareOptionsMenu()方法,他在菜单每次被打开时调用。他会传递你的menu对象,就像onCreateOptionsMenu()方法那样。如果你想根据程序或者游戏现在的状态来确定是否修改menu 的话,这个方法将会非常有用。

注意:当改变menu里的菜单项时,不提倡直接操作当前选中项。请记住,当在触摸模式下,是没有当前选中项的,相反,你应该使用Context Menu 来做这样的操作:在UI的特定项目里提供这样的功能。

 


Context Menu

android的 Context Menu 也是类似的,在PC上,即为右键菜单。当一个view注册了Context Menu 菜单后,长按这个view便能显示菜单,提供一些与此view相关的功能。Context menus可以使用任何的view,但通常被注册成listView,这种view会使选中的项目非常的明显。(待会会有一个例子)

注意:Context Menu条目不支持图标和快捷键。

要创建一个Context Menu,你必须重写activity的 Context Menu 回调方法:onCreateContextMenu()和 onContextItemSelected()方法。在onCreateContextMenu()回调方法中,你可以通过add()方法添加菜单项,或者使用xml配置文件添加,然后yon registerForContextMenu()方法注册成为ContextMenu。

例如,下面是在笔记本应用程序中添加contextMenu的例子:

  1. public void onCreateContextMenu(ContextMenu menu, View v,  
  2.                                 ContextMenuInfo menuInfo) {  
  3.   super.onCreateContextMenu(menu, v, menuInfo);  
  4.   menu.add(0, EDIT_ID, 0"Edit");  
  5.   menu.add(0, DELETE_ID, 0,  "Delete");  
  6. }  
  7. public boolean onContextItemSelected(MenuItem item) {  
  8.   AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();  
  9.   switch (item.getItemId()) {  
  10.   case EDIT_ID:  
  11.     editNote(info.id);  
  12.     return true;  
  13.   case DELETE_ID:  
  14.     deleteNote(info.id);  
  15.     return true;  
  16.   default:  
  17.     return super.onContextItemSelected(item);  
  18.   }  
  19. }  
 

在onCreateContextmenu()方法中,我们不仅仅只能给contextMenu添加菜单项,而且还可以给选中的view或者是ContextMenuInfo对象添加。ContextMenuInfo对象提供了选中对象的一些相关信息。例如,在OnCreateContextMenu()方法中添加两个很普通的item条目。在onContextItemSelected()方法中,我们需要得到菜单项的AdapterContextmenuInfo,来获取关于当前选中项的某些信息。我们只需要选中条目的id即可,所以无论添加或者删除,我们只需要知道AdapterContextMenuInfo.info 这个属性即可。然后这个id会被传递到deitNote()方法或者deleteNote方法来做相应的处理。

现在,为ListView中所有的项添加contextMenu方法,我们把整个ListView传递给registerForContextMenu(View)方法。

registerForContextMenu(getListView());

记住,你可以传递任何view对象来注册 contextMenu菜单,getListView()方法会返回在ListActivity类中使用到的ListView,因此,list中的每一项都会注册一个contextMenu。

 


子菜单Submenus

一个子菜单可以被添加到任何菜单,但不不能添加到子菜单中。当你的应用程序有很多功能需要被显示的时候非常有用。你可以用add()方法给menu添加额外的条目,例如:

  1. SubMenu fileMenu = menu.addSubMenu("File");  
  2.   SubMenu editMenu = menu.addSubMenu("Edit");  
  3.   fileMenu.add("new");  
  4.   fileMenu.add("open");  
  5.   fileMenu.add("save");  
  6.   editMenu.add("undo");  
  7.   editMenu.add("redo");  
  8.   return result;  
  9. }  
 

子菜单中的回调方法会传递给父菜单的回调方法。如上所示:子菜单的选择结果会传递到父菜单的onOptionsItemSelected();

 


在xml文件中定义Menus

就像UI布局一样,你可以在xml文件中定义菜单。然后再onCreate()方法中实例化他们。这样会让你的程序代码更加简洁,并且让代码和视图分离,更加可视化。

首先,在res文件夹下建立一个menu文件夹。你可以在这里定义菜单。

在一个菜单的xml布局中,有三个元素:<menu><group><item>。

Item和group元素必须是menu的子元素,但item还可以是group的子元素,menu元素必须有一个子元素,当然了,最外层的根元素必须是menu。

作为一个例子,我们建一个和上面一样的操作菜单,先在res/menu/文件夹下建一个option_menu.xml文件

  1. <menu xmlns:android="http://schemas.android.com/apk/res/android">  
  2.     <item android:id="@+id/new_game"  
  3.           android:title="New Game" />  
  4.     <item android:id="@+id/quit"  
  5.           android:title="Quit" />  
  6. </menu>  
 

然后,在onCreateOptionsMenu()方法中,我们用MenuInflater.inflate()方法加载这个资源:

  1. public boolean onCreateOptionsMenu(Menu menu) {  
  2.     MenuInflater inflater = getMenuInflater();  
  3.     inflater.inflate(R.menu.options_menu, menu);  
  4.     return true;  
  5. }  
 

getMenuInflater()方法会返回activity的菜单解析器,我们可以调用inflate()方法来传递先前定义好的menu资源的指针,在回调方法中可以得到菜单对象。

虽然这种方式看似更加麻烦,但当你处理大量items时会为你省很多事,并且让你的代码看起来更加整洁。

你可以定义menu group,在group元素里包装item来定义menu group,并且在item里创建别的menu,每个元素都支持一些基本属性如快捷键、选择框、图标等。学习更多的属性可以参考XML syntax.

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
android 上下文菜单Context Menu
Android按键之Menu详解
Delphi编写windows外壳扩展
android中layout(布局)和menu(菜单)
Android 的上下文菜单: Context Menu
android的ContextMenu - indexRoad-索引之路 - 博客园
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服