Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1071510
  • 博文数量: 403
  • 博客积分: 10272
  • 博客等级: 上将
  • 技术积分: 4407
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-24 14:22
文章分类

全部博文(403)

文章存档

2012年(403)

分类: 嵌入式

2012-03-06 16:36:10

/********************************************************************************************
 * author:conowen@大钟                                                                                                                          
 * E-mail:conowen@hotmail.com                                                                                                             
 * http://blog.csdn.net/conowen                                                                                                              
 * 注:本文为原创,仅作为学习交流使用,转载请标明作者及出处。      
 ********************************************************************************************/


1、Android的Menu简介

Android系统的Menu主要有三种,OptionsMenu、ContextMenu、SubMenu。

Android手机一般都以一个Menu键,当按下Menu键时,每个activity都会相应这一事件。menu选项从左到右,从上到下排列。最多可以显示六个,当多于六个时,第六个选项是“更多”,点击就可以看到更多的选项了。



2、OptionsMenu用法

2.1、创建Menu

       按下Menu键时,屏幕底部就会弹出menu选项,提供选择。创建OptionsMenu的方法是通过复写onCreateOptionsMenu(),然后通过menu.add()方法添加各种选项,add方法的详细参数和返回值如下。

  1. public abstract MenuItem add (int groupId, int itemId, int order, CharSequence title)   

groupId   The group identifier that this item should be part of. This can be used to define groups of items for batch state changes.

                Normally use NONE if an item should not be in a group.
itemId     Unique item ID. Use NONE if you do not need a unique ID. 
order       The order for the item. Use NONE if you do not care about the order. See getOrder().
title         The text to display for the item. 


Returns     The newly added menu item. 
            

第一个,组别,用来划分itemid的。一般为Menu.NONE

第二个,ID。是menu识别编号,供识别menu用的。很重要。
第三个,顺序。这个参数的大小决定菜单选项出现的先后顺序。顺序按照参数由小到大。
第四个,显示文本。

返回值为turn时,menu才有效,若是 return false;则menu不能显示,也就是说menu无效。
复写方法onCreateOptionsMenu()时,就有个 return super.onCreateOptionsMenu(menu);,默认就行了。
添加menu选项例子:
  1. menu.add(Menu.NONE,0,0,"添加").setIcon(android.R.drawable.ic_menu_add);  

2.2、处理Menu
通过复写onOptionsItemSelected()方法即可,然后通过item.getItemId(),筛选不同的itemid,然后执行相应的方法。
  1. switch (item.getItemId()) {  
  2.         case 0:  
  3.             Toast.makeText(this"添加", Toast.LENGTH_SHORT).show();  
  4.             break;  
  5.         default:  
  6.             Toast.makeText(this"方法还没定义", Toast.LENGTH_SHORT).show();  
  7.             break;  
  8.         }  
  9.         return super.onOptionsItemSelected(item);  
2.3、其他方法
onPrepareOptionsMenu()方法简述
     点击menu按钮时,menu显示出来前,通过复写这个方法可以定义处理事件。

onOptionsMenuClosed()简述
      退出menu之后,通过复写这个方法可以定义处理事件。menu按钮再被点击,back按钮被点击,或者用户选择了menu其中的一个选项,menu都会退出。

=============================
全部demo源代码

  1. /*author:conowen 
  2.  * date:2012.2.25 
  3.  */  
  4. package conowen.szu.menu;  
  5.   
  6. import android.app.Activity;  
  7. import android.os.Bundle;  
  8. import android.view.Menu;  
  9. import android.view.MenuItem;  
  10. import android.widget.Toast;  
  11.   
  12. public class MenuActivity extends Activity {  
  13.   
  14.     /** Called when the activity is first created. */  
  15.     @Override  
  16.     public void onCreate(Bundle savedInstanceState) {  
  17.         super.onCreate(savedInstanceState);  
  18.         setContentView(R.layout.main);  
  19.   
  20.     }  
  21.   
  22.     @Override  
  23.     public boolean onCreateOptionsMenu(Menu menu) {  
  24.         // TODO Auto-generated method stub  
  25.   
  26.         menu.add(Menu.NONE, 00"添加").setIcon(android.R.drawable.ic_menu_add);  
  27.         menu.add(Menu.NONE, 11"保存")//设置图标  
  28.                 .setIcon(android.R.drawable.ic_menu_save);  
  29.         menu.add(Menu.NONE, 22"发送")  
  30.                 .setIcon(android.R.drawable.ic_menu_send);  
  31.         menu.add(Menu.NONE, 33"详细").setIcon(  
  32.                 android.R.drawable.ic_menu_info_details);  
  33.         menu.add(Menu.NONE, 44"删除").setIcon(  
  34.                 android.R.drawable.ic_menu_delete);  
  35.         menu.add(Menu.NONE, 55"帮助")  
  36.                 .setIcon(android.R.drawable.ic_menu_help);  
  37.         menu.add(Menu.NONE, 66"搜索").setIcon(  
  38.                 android.R.drawable.ic_menu_search);  
  39.   
  40.         return super.onCreateOptionsMenu(menu);  
  41.         // return false;  
  42.     }  
  43.   
  44.     @Override  
  45.     public boolean onOptionsItemSelected(MenuItem item) {  
  46.         // TODO Auto-generated method stub  
  47.         switch (item.getItemId()) {  
  48.         case 0:  
  49.             Toast.makeText(this"添加", Toast.LENGTH_SHORT).show();  
  50.             break;  
  51.         case 1:  
  52.             Toast.makeText(this"保存", Toast.LENGTH_SHORT).show();  
  53.             break;  
  54.         case 2:  
  55.             Toast.makeText(this"发送", Toast.LENGTH_SHORT).show();  
  56.             break;  
  57.         case 3:  
  58.             Toast.makeText(this"详细", Toast.LENGTH_SHORT).show();  
  59.             break;  
  60.   
  61.         default:  
  62.             Toast.makeText(this"方法还没定义", Toast.LENGTH_SHORT).show();  
  63.             break;  
  64.         }  
  65.         return super.onOptionsItemSelected(item);  
  66.     }  
  67.   
  68.     @Override  
  69.     public boolean onPrepareOptionsMenu(Menu menu) {  
  70.         // TODO Auto-generated method stub  
  71.         Toast.makeText(this"menu没出来时,处理方法自己定义即可", Toast.LENGTH_SHORT).show();  
  72.         return super.onPrepareOptionsMenu(menu);  
  73.     }  
  74.   
  75.     @Override  
  76.     public void onOptionsMenuClosed(Menu menu) {  
  77.         // TODO Auto-generated method stub  
  78.         Toast.makeText(this"menu退出后,处理方法自己定义即可", Toast.LENGTH_SHORT).show();  
  79.         super.onOptionsMenuClosed(menu);  
  80.     }  
  81. }  

3、SubMenu用法

SubMenu实现的是子菜单功能,如“添加”的下一级菜单为“从网络添加”和“从本地添加两个选项的Menu”

  1. SubMenu submenu=menu.addSubMenu(Menu.NONE, 00"添加")  
  2.                 .setIcon(android.R.drawable.ic_menu_add);  
  3.         submenu.add(Menu.NONE, 100"从网络添加");  
  4.         submenu.add(Menu.NONE, 111"从本地添加");  
submenu.add()方法不能设置图标,设置了也是无效的。


  1. /*author:conowen 
  2.  * date:2012.2.25 
  3.  */  
  4. package conowen.szu.menu;  
  5.   
  6. import android.app.Activity;  
  7. import android.os.Bundle;  
  8. import android.view.Menu;  
  9. import android.view.MenuItem;  
  10. import android.view.SubMenu;  
  11. import android.widget.Toast;  
  12.   
  13. public class MenuActivity extends Activity {  
  14.   
  15.     /** Called when the activity is first created. */  
  16.     @Override  
  17.     public void onCreate(Bundle savedInstanceState) {  
  18.         super.onCreate(savedInstanceState);  
  19.         setContentView(R.layout.main);  
  20.   
  21.     }  
  22.   
  23.     @Override  
  24.     public boolean onCreateOptionsMenu(Menu menu) {  
  25.         // TODO Auto-generated method stub  
  26.         SubMenu submenu=menu.addSubMenu(Menu.NONE, 00"添加")  
  27.                 .setIcon(android.R.drawable.ic_menu_add);  
  28.         submenu.add(Menu.NONE, 100"从网络添加");  
  29.         submenu.add(Menu.NONE, 111"从本地添加");  
  30.           
  31.           
  32.         menu.add(Menu.NONE, 11"保存")//设置图标  
  33.                 .setIcon(android.R.drawable.ic_menu_save);  
  34.   
  35.   
  36.   
  37.         return super.onCreateOptionsMenu(menu);  
  38.         // return false;  
  39.     }  
  40.   
  41.     @Override  
  42.     public boolean onOptionsItemSelected(MenuItem item) {  
  43.         // TODO Auto-generated method stub  
  44.         switch (item.getItemId()) {  
  45.         case 0:  
  46.             Toast.makeText(this"添加", Toast.LENGTH_SHORT).show();  
  47.             break;  
  48.         case 1:  
  49.             Toast.makeText(this"保存", Toast.LENGTH_SHORT).show();  
  50.             break;  
  51.         case 10:  
  52.             Toast.makeText(this"从网络添加", Toast.LENGTH_SHORT).show();  
  53.             break;  
  54.         case 11:  
  55.             Toast.makeText(this"从本地添加", Toast.LENGTH_SHORT).show();  
  56.             break;  
  57.   
  58.         default:  
  59.               
  60.             break;  
  61.         }  
  62.         return super.onOptionsItemSelected(item);  
  63.     }  
  64.   
  65.       
  66. }  


4、ContextMenu用法

        长按某个View达2秒后,就弹出menu。创建的方法是复写onCreateContextMenu()方法,处理方法是onContextItemSelected()。因为是长按某一个View,所以ContextMenu要注册到目标view,才能实现。

注册方法如下(如,注册到一个EditText,长按这个EditText就可以调出Menu了),et是EditText的id

  1. this.registerForContextMenu(findViewById(R.id.et));  
onCreateContextMenu里面的add()方法不能添加图标()setIcon,就算添加了,也不能显示出来的。在onCreateContextMenu方法里面也能设置submenu子菜单,方法参考第3点


  1. /*author:conowen 
  2.  * date:2012.2.25 
  3.  */  
  4. package conowen.szu.menu;  
  5.   
  6. import android.app.Activity;  
  7. import android.os.Bundle;  
  8. import android.view.ContextMenu;  
  9. import android.view.ContextMenu.ContextMenuInfo;  
  10. import android.view.Menu;  
  11. import android.view.MenuItem;  
  12. import android.view.View;  
  13. import android.widget.Toast;  
  14.   
  15. public class MenuActivity extends Activity {  
  16.   
  17.   
  18.   
  19.     /** Called when the activity is first created. */  
  20.     @Override  
  21.     public void onCreate(Bundle savedInstanceState) {  
  22.         super.onCreate(savedInstanceState);  
  23.         setContentView(R.layout.main);  
  24.         this.registerForContextMenu(findViewById(R.id.et));  
  25.         //注册到EditText,et是它的id  
  26.   
  27.     }  
  28.   
  29.     @Override  
  30.     public void onCreateContextMenu(ContextMenu menu, View v,  
  31.             ContextMenuInfo menuInfo) {  
  32.         // TODO Auto-generated method stub  
  33.         menu.add(Menu.NONE, 00"添加");  
  34.         menu.add(Menu.NONE, 11"保存");  
  35.         menu.add(Menu.NONE, 22"发送");  
  36.         menu.add(Menu.NONE, 33"详细");  
  37.         menu.add(Menu.NONE, 44"删除");  
  38.         menu.add(Menu.NONE, 55"帮助");  
  39.         menu.add(Menu.NONE, 66"搜索");  
  40.         super.onCreateContextMenu(menu, v, menuInfo);  
  41.     }  
  42.     @Override  
  43.     public boolean onContextItemSelected(MenuItem item) {  
  44.         // TODO Auto-generated method stub  
  45.         switch (item.getItemId()) {  
  46.         case 0:  
  47.             Toast.makeText(this"添加", Toast.LENGTH_SHORT).show();  
  48.             break;  
  49.         case 1:  
  50.             Toast.makeText(this"保存", Toast.LENGTH_SHORT).show();  
  51.             break;  
  52.         case 2:  
  53.             Toast.makeText(this"发送", Toast.LENGTH_SHORT).show();  
  54.             break;  
  55.         case 3:  
  56.             Toast.makeText(this"详细", Toast.LENGTH_SHORT).show();  
  57.             break;  
  58.   
  59.         default:  
  60.             Toast.makeText(this"方法还没定义", Toast.LENGTH_SHORT).show();  
  61.             break;  
  62.         }  
  63.         return super.onContextItemSelected(item);  
  64.     }  
  65.       
  66. }  
阅读(968) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~