android菜单详解

理解Android的菜单


  1. 选项菜单:最常规的菜单,android中把它叫做option menu
  2. 子菜单:android中点击子菜单将弹出悬浮窗口显示子菜单项。子菜单不支持嵌套,即子菜单中不能再包括其他子菜单。
  3. 上下文菜单:android中长按视图控件后出现的菜单,windows点击右键弹出的菜单即上下文菜单
  4. 图标菜单:这个比较简单,就是带icon的菜单项,需要注意的是子菜单项、上下文菜单项、扩展菜单项均无法显示图标
  5. 选择菜单(alternative menu):用的比较少,以后单独介绍,本文先跳过(其实是我还没弄明白啦o(≧v≦)o~~)
  6. 扩展菜单:选项菜单最多只能显示6个菜单项,超过6个时,第6个菜单项会被系统替换为一个叫“更多”的子菜单,原来显示不下的菜单项都
为“更多”菜单的子菜单项。如下图作 

       


每个activity包含一个菜单,一个菜单又能包含多个菜单项和多个子菜单,子菜单其实也是菜单(因为它实现了Menu接口),因此子菜单也可以包含多个菜单项。OnCreateOptionsMenu()和OnOptionsMenuSelected()是activity中提供了两个回调方法,用于创建菜单项和响应菜单项的点击

1,创建options menu  选项菜单

[java] view plaincopy
  1. @Override  
  2.     public boolean onCreateOptionsMenu(Menu menu) {  
  3.         //为了兼容以后的版本  
  4.         super.onCreateOptionsMenu(menu);  
  5.           
  6.         //多种方式添加菜单项  
  7.           
  8.         //menu.add("菜单项1");//1,直接指定标题,这个响应的时候我不知道怎么调用  
  9.         //menu.add(R.string.menuitem2);//2,通过资源指定标题  
  10.           
  11.         menu.add(1, Menu.FIRST, 1"菜单项1");//3,显式指定菜单项的组号,ID , 排序,标题  
  12.         menu.add(1, Menu.FIRST+12"菜单项2");  
  13.         menu.add(2, Menu.FIRST+23"菜单项3");  
  14.         menu.add(2, Menu.FIRST+34"菜单项4");  
  15.         menu.add(2, Menu.FIRST+45"菜单项5");  
  16.         menu.add(2, Menu.FIRST+56"菜单项6");//多于6个将会被系统以更多字样替换  
  17.         menu.add(2, Menu.FIRST+67"菜单项7");  
  18.         menu.add(2, Menu.FIRST+78"菜单项8");  
[java] view plaincopy
  1. return true;//如果希望现实菜单,返回true  

响应菜单项

使用的最多方法是重写activity类的 onOptionsItemSelected(MenuItem)回调方法,每当有菜单项被点击时,android就会调用该方法,并传入被点击菜单项。
以下代码可作为使用onOptionsItemSelected方法响应菜单的模板来使用,这里为了方便起见将菜单ID硬编码在程序里,你可以使用常量或资源ID来使代码更健壮
[java] view plaincopy
  1. @Override  
  2.     public boolean onOptionsItemSelected(MenuItem item) {  
  3.           
  4.         switch(item.getItemId()){  
  5.         case 1:  
  6.             //do something  
  7.             Toast.makeText(this"1", Toast.LENGTH_LONG).show();  
  8.             break;  
  9.         case 2:  
  10.             Toast.makeText(this"2", Toast.LENGTH_LONG).show();  
  11.             break;  
  12.         case 3:  
  13.             Toast.makeText(this"3", Toast.LENGTH_LONG).show();  
  14.             break;  
  15.         case 4:  
  16.             Toast.makeText(this"4", Toast.LENGTH_LONG).show();  
  17.             break;  
  18.         default:  
  19.             return super.onOptionsItemSelected(item);  
  20.         }  
  21.           
  22.         return true;  
  23.     }  

使用监听器响应菜单项

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

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


该方法先于onOptionsItemSelected执行

[java] view plaincopy
  1. <h1 style="font-family: verdana; "><a name="t4"></a>2,子菜单Sub Menu</h1><span style="font-family: verdana; ">Android支持子菜单,你可以通过addSubMenu</span><span style="font-family: verdana; ">(int groupId, int itemId, int order, int titleRes)方法非常方便的创建和响应子菜单。</span>  

[java] view plaincopy
  1. @Override  
  2.     public boolean onCreateOptionsMenu(Menu menu) {  
  3.         //为了兼容以后的版本  
  4.         super.onCreateOptionsMenu(menu);  
  5.                   
  6.         //添加子菜单  
  7.         //一个菜单可以有多个子菜单  
  8.                           menu.addSubMenu(1, Menu.FIRST, 1"系统设置" );  
  9.         SubMenu subMenu = menu.addSubMenu(1, Menu.FIRST+12"网络设置" );//子菜单支持图标  
  10.         subMenu.setIcon(R.drawable.ic_launcher);  
  11.           
  12.         MenuItem menuItem = subMenu.add(2, Menu.FIRST+2, Menu.NONE, "菜单项1");//子菜单项不支持显示图标  
  13.         //menuItem.setIcon(R.drawable.ic_launcher);  
  14.         subMenu.add(2, Menu.FIRST+3, Menu.NONE, "菜单项2");  
  15.         subMenu.add(2, Menu.FIRST+4, Menu.NONE, "菜单项3");  
  16.         subMenu.add(2, Menu.FIRST+5, Menu.NONE, "菜单项4");  
  17.           
  18.         return true;//如果希望现实菜单,返回true  
  19.     }  
  

上面的代码演示了如何创建子菜单,其菜单项的响应其实就是普通菜单项的响应

3,图标菜单Icon Menu

Android支持在菜单上显示各种各样的图标,这一点我们在上面创建子菜单时已经用到了

[java] view plaincopy
  1. SubMenu subMenu = menu.addSubMenu(1, Menu.FIRST+12"网络设置" );//子菜单支持图标  
  2. subMenu.setIcon(R.drawable.ic_launcher);  

Android中并不是所谓的菜单项都能加上图标,以下菜单项都是不可以的(这并不意味着程序会报错,而是运行时图标得不到显示):

  • 扩展的菜单项。
  • 子菜单的菜单项
  • 上下文菜单的菜单项

4,ContextMenu简介

在Windows中,我们已经习惯了在文件上单击右键来执行“打开”、“重名名”、“剪切”、“删除”等操作,这个右键弹出的菜单就是上下文菜单.
android是通过长按某个视图元素来弹出上下文菜单的.
上下文菜单与Options Menu最大的不同在于,Options Menu的拥有者是Activity,而上下文菜单的拥有者是Activity中的View。每个Activity有且只有一个Options Menu,它为整个Activity服务。而一个Activity往往有多个View,并不是每个View都有上下文菜单,这就需要我们显示地通过
registerForContextMenu(Viewview)来指定。

下面给出一个demo演示如何创建和响应上下文菜单:

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

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

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

 

[java] view plaincopy
  1. public class MenuDemoActivity extends Activity {  
  2.     private ListView listView;   
  3.     @Override  
  4.     public void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.         setContentView(R.layout.main);  
  7.         initView();//做一些初始化工作  
  8.     }  
  9.   
  10.     private void initView() {  
  11.         listView = (ListView) this.findViewById(R.id.listview);  
  12.         listView.setAdapter(new MyAdapter());  
  13.         this.registerForContextMenu(listView);//1 为所有列表项注册上下文菜单,注意和响应事件不一样  
  14.           
  15.           
  16.     }  
  17.     //给ListView提供一些数据  
  18.     private class MyAdapter extends BaseAdapter{  
  19.   
  20.         public int getCount() {  
  21.               
  22.             return 5;  
  23.         }  
  24.   
  25.         public Object getItem(int position) {  
  26.             // TODO Auto-generated method stub  
  27.             return null;  
  28.         }  
  29.   
  30.         public long getItemId(int position) {  
  31.             // TODO Auto-generated method stub  
  32.             return 0;  
  33.         }  
  34.   
  35.         public View getView(int position, View convertView, ViewGroup parent) {  
  36.             TextView tv = new TextView(MenuDemoActivity.this);  
  37.             tv.setText("文件"+position);  
  38.             return tv;  
  39.         }  
  40.           
  41.     }  
  42.       
  43.     @Override  
  44.     //2 创建上下文菜单  
  45.     public void onCreateContextMenu(ContextMenu menu, View v,  
  46.             ContextMenuInfo menuInfo) {  
  47.           
  48.         super.onCreateContextMenu(menu, v, menuInfo);  
  49.         menu.setHeaderTitle("文件操作");  
  50.         menu.add(1, Menu.FIRST, Menu.NONE, "发送");  
  51.         menu.add(1, Menu.FIRST+1, Menu.NONE, "标记为重要");  
  52.         menu.add(1, Menu.FIRST+2, Menu.NONE, "重命名");  
  53.         menu.add(1, Menu.FIRST+3, Menu.NONE, "删除");  
  54.     }  
  55.       
  56.     @Override  
  57.     //3 响应上下文菜单  
  58.     public boolean onContextItemSelected(MenuItem item) {  
  59.         switch(item.getItemId()){  
  60.         case 1:  
  61.             Toast.makeText(this"发送"1).show();  
  62.             break;  
  63.         case 2:  
  64.             Toast.makeText(this"标记为重要"1).show();  
  65.             break;  
  66.         case 3:  
  67.             Toast.makeText(this"重命名"1).show();  
  68.             break;  
  69.         case 4:  
  70.             Toast.makeText(this"删除"1).show();  
  71.             break;  
  72.         default:  
  73.               
  74.             return super.onContextItemSelected(item);  
  75.         }  
  76.         return true;  
  77.     }  
  78. }  
  79.       
  80.       
运行程序,多次调出上下文菜单,注意LogCat的输出,onCreateContextMenu每一次都被调用了。

展开阅读全文

没有更多推荐了,返回首页