理解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每一次都被调用了。

 

稳定

产品高可用性高并发

贴心

项目群及时沟通

专业

产品经理1v1支持

快速

MVP模式小步快跑

承诺

我们选择声誉

坚持

10年专注高端品质开发
  • 返回顶部