Android中的Menu菜单小解

来源:互联网 发布:c语言strtok返回值 编辑:程序博客网 时间:2024/05/22 15:31

原文地址:

http://blog.csdn.net/rhljiayou/article/details/7068567


 1150人阅读 评论(0) 收藏 举报
androidmenuswingencodingxmlwindows

Android SDK提供的菜单有如下几种:

1.   选项菜单:最常规的菜单,android中把它叫做option menu

2.   子菜单:android中点击子菜单将弹出悬浮窗口显示子菜单项。子菜单不支持嵌套,即子菜单中不能再包括其他子菜单。

3.   上下文菜单:android中长按视图控件后出现的菜单,windows点击右键弹出的菜单即上下文菜单

选项菜单最多只能显示6个菜单项,超过6个时,第6个菜单项会被系统替换为一个叫“更多”的子菜单,原来显示不下的菜单项都作为“更多”菜单的子菜单项。如下图:


第6个菜单项自动变为“更多”


点击“更多”显示其他菜单项

每个菜单都包含两个部分:

1. 建立菜单

2. 处理选项动作

"onCreateOptionsMenu" 函数即菜单列的主体。在 Android 机器或模拟器上按下硬体 的"Menu"( 菜单 ) 键,所弹出的菜单列即是靠 "onCreateOptionsMenu" 函数来定义。当我们在Activity 中定义了"onCreateOptionsMenu" 之后,按下"Menu"( 菜单 ) 键时,就会弹出相对应的菜单列。当我们在 Android 应用程序的菜单列上选择了相应的选项后,则是依赖"onOptionsItemSelected" 函数,来负责处理菜单列中各选项所个别对应的动作。

关系可以用下图来表示:


Android的activity已经为我们提前创建好了android.view.Menu对象,并提供了回调方法onCreateOptionsMenu(Menu menu)供我们初始化菜单的内容。该方法只会在选项菜单第一次显示的时候被执行,如果你需要动态改变选项菜单的内容,请使用onPrepareOptionsMenu(Menu)。

public boolean onPrepareOptionsMenu(Menumenu) {//动态的修改菜单title

           MenuItemitem=menu.findItem(SAVE_AS);

           item.setTitle(item.getTitle()+""+i);

           i++;

           returnsuper.onPrepareOptionsMenu(menu);

      }

代码创建和响应最常用的选项菜单:

[java] view plaincopy
  1. publicboolean onCreateOptionsMenu(Menu menu) {  
  2.     // 调用父类方法来加入系统菜单  
  3.     // 虽然目前android还没有系统菜单,但是为了兼容到以后的版本,最好加上  
  4. super.onCreateOptionsMenu(menu);  
  5.      
  6.     // 添加菜单项(多种方式)  
  7.     // 1.直接指定标题  
  8.     menu.add("菜单项1");  
  9.     // 2.通过资源指定标题  
  10.     menu.add(R.string.menuitem2);  
  11.     // 3.显示指定菜单项的组号、ID、排序号、标题  
  12.     menu.add(  
  13.             1,            //组号  
  14.             Menu.FIRST, //唯一的ID号  
  15.             Menu.FIRST, //排序号  
  16. "菜单项3"); //标题  
  17.      
  18.     // 如果希望显示菜单,请返回true  
  19. returntrue;  
  20. }  

上面的代码演示了添加菜单项的3种方法,下面解释下第三种方法add(intgroupId, int itemId, int order,CharSequence title)。其中,第一个参数是组号,android中你可以给菜单分组,以便快速地操作同一组的菜单。第二个参数指定每个菜单项的唯一ID号,你可以自己指定,也可以让系统来自动分配,在响应菜单时你需要通过ID号来判断哪个菜单被点击了。因此常规的做法是定义一些ID常量,但在android中有更好的方法,就是通过资源文件来引用,这个之后介绍。第三个参数代表菜单项显示顺序的编号,编号小的显示在前面。

使用xml生成菜单:

Options_menu.xml文件

[html] view plaincopy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <menu xmlns:android="http://schemas.android.com/apk/res/android" >  
  3.     <item   
  4.         android:id="@+id/newFile"  
  5.         android:icon="@drawable/ic_launcher"  
  6.         android:title="@string/newFile"/>  
  7.     <!-- android:icon 设置菜单选项的图标    
  8.     android:title 设置菜单选项的标题 -->    
  9.     <item   
  10.         android:id="@+id/exit"  
  11.         android:icon="@drawable/ic_launcher"  
  12.         android:title="@string/exit"/>  
  13.   
  14. </menu>  

在activity中加上下面这两句:

MenuInflaterinflater=this.getMenuInflater();

inflater.inflate(R.menu.options_menu,menu);

xml相应的菜单就会加入进去;

inflater在android中建立了从资源文件到对象的桥梁,MenuInflater即把菜单xml资源转换为对象并添加到menu对象中,它可以通过activity的getMenuInflater()得到。我们在MainActivity中重写onCreateOptionsMenu(...)方法。

下面介绍响应菜单项的方式,一共有三种:

1、通过onOptionsItemSelected方法

使用的最多方法是重写activity类的onOptionsItemSelected(MenuItem)回调方法,每当有菜单项被点击时,android就会调用该方法,并传入被点击菜单项。

[java] view plaincopy
  1. publicboolean onOptionsItemSelected(MenuItem item) {  
  2.     switch (item.getItemId()) {  
  3.     //响应每个菜单项(通过菜单项的ID)  
  4. case1:  
  5.         // do something here  
  6. break;  
  7.     case2:  
  8.         // do something here  
  9. break;  
  10. }  
  11.     //返回true表示处理完菜单项的事件,不需要将该事件继续传播下去了  
  12. return true;  
  13. }  

2.使用监听器

虽然第一种方法是推荐使用的方法,android还是提供了类似java swing的监听器方式来响应菜单。使用监听器的方式分为两步:

[java] view plaincopy
  1. //第一步:创建监听器类  
  2. class MyMenuItemClickListener implements OnMenuItemClickListener {  
  3.     @Override  
  4.     publicboolean onMenuItemClick(MenuItem item) {  
  5.         // do something here...  
  6. returntrue;    //finish handling  
  7.     }  
  8. }  
  9.   
  10. //第二步:为菜单项注册监听器  
  11. menuItem.setOnMenuItemClickListener(new MyMenuItemClickListener());  

3.使用Intent响应菜单

第3种方式是直接在MenuItem上调用setIntent(Intentintent)方法,这样android会自动在该菜单被点击时调用 startActivity(Intent)。但是个人认为与其这样还不如直接在onOptionsItemSelected的case里手动调用 startActivity(Intent)来的直观。

创建和响应上下文菜单:

1.在activity的onCreate(...)方法中为一个view注册上下文菜单

2.在onCreateContextMenuInfo(...)中生成上下文菜单。

3.在onContextItemSelected(...)中响应上下文菜单项。

//将上下文菜单绑定到TextView上 

              TextView tv = (TextView)this.findViewById(R.id.textView); 

              this.registerForContextMenu(tv);  //注册上下文菜单

生成上下文菜单

[java] view plaincopy
  1. //每次上下文菜单显示都会调用    
  2.         public void onCreateContextMenu(ContextMenu menu, View v,    
  3.                 ContextMenuInfo menuInfo) {    
  4.                 
  5.             MenuInflater inflater = this.getMenuInflater();    
  6.             inflater.inflate(R.menu.sub_menu, menu);    
  7.             super.onCreateContextMenu(menu, v, menuInfo);    
  8.         }    

响应上下文菜单项。

[java] view plaincopy
  1. public boolean onContextItemSelected(MenuItem item) {    
  2.             switch(item.getItemId()){    
  3.                 case R.id.menuitem1:    
  4.                     Toast.makeText(this"subitem1",Toast.LENGTH_LONG).show();    
  5.                     break;    
  6.                 case R.id.menuitem2:    
  7.                     Toast.makeText(this"subitem2",Toast.LENGTH_LONG).show();    
  8.                     break;    
  9.             }    
  10.             return super.onContextItemSelected(item);    
  11.         }    


0 0