Android--菜单详解

学向勤中得,萤窗万卷书。这篇文章主要讲述Android--菜单详解相关的知识,希望能为你提供帮助。
Android中的菜单分为三种,即选项菜单(系统菜单),上下文菜单和弹出式菜单。
选项菜单:
一个activity只有一个选项菜单,选项菜单的创建方式有低版本创建和高版本创建两种。最常用的是干版本创建,所以这里着重高版本的创建方式的介绍。
创建步骤:
1, 在res/menu/文件夹中xml 中定义每个菜单项

< item
  android:id =" 菜单中每个Item的id"
  android:title="每个Item 文本信息"
  android:orderInCategory :Menu中显示的顺序,数字越小, 越在前面显示,  如果数字一样, 先写那个   那个就在前面位置显示
    android:showAsAcrtion:设置Menu何时和怎样显示在Action Bar中。
    其中属性值:never   :   永远都不显示在Action Bar中
      always :   一直显示在Action Bar中
      ifRoom :   如果有空间 则显示在Action Bar中
/>
2, 在activity中 显示菜单项
重写父类的方法:
onCreateOptionsMenu(Menu menu)
{
//加载菜单
getMenuInflater.inflat(R.menu.main,menu);
}
3, 在activity中 每个菜单项实现点击
重新父类的方法:
onOptionsItemSelected(MenuItem item)
{
switch(item.getItemId())
{
  case R.id.action_red:
.......
  break;
}
}

低版本创建: 
//低版本的创建   /**
* groupId   分组ID
* itemId   菜单项的Id
* order     排序
* title     菜单显示的文字
*/
menu.add(menu.NONE, MENU_ONE, menu.NONE, "代码创建的菜单");
//带有子菜单的一级菜单
SubMenu subMenu = menu.addSubMenu(menu.NONE, 2, menu.NONE, "sub 1");
subMenu.add(menu.NONE, 21, 1, "sub 1-1");
subMenu.add(menu.NONE, 22, 2, "sub 1-2");
subMenu.add(menu.NONE, 23, 0, "sub 1-3");
实例:
[java]  view plain  copy     print?

  1. public  class  MainActivity  extends  Activity  {   
  2.         private  TextView  t;    
  3.    
  4.         @Override   
  5.         protected  void  onCreate(Bundle  savedInstanceState)  {   
  6.                 super.onCreate(savedInstanceState);    
  7.                 setContentView(R.layout.activity_main);    
  8.                 t  =  (TextView)  findViewById(R.id.t);    
  9.         }   
  10. @Override   
  11.         public  boolean  onCreateOptionsMenu(Menu  menu)  {   
  12.                 //  Inflate  the  menu;   this  adds  items  to  the  action  bar  if  it  is  present.   
  13.                 getMenuInflater().inflate(R.menu.main,  menu);    
  14.                 return  true;    
  15.         }   
  16.    
  17.         @Override   
  18.         public  boolean  onOptionsItemSelected(MenuItem  item)  {   
  19.                 switch  (item.getItemId())  {   
  20.                 case  R.id.red:   
  21.                         t.setTextColor(Color.RED);    
  22.                         t.setTextSize(12);    
  23.                         break;    
  24.                 case  R.id.green:   
  25.                         t.setTextColor(Color.GREEN);    
  26.                         t.setTextSize(22);    
  27.    
  28.                         break;    
  29.                 case  R.id.blue:   
  30.                         t.setTextColor(Color.BLUE);    
  31.                         t.setTextSize(32);    
  32.                         break;    
  33.                 }   
  34.                 return  super.onOptionsItemSelected(item);    
  35.         }   
[html]  view plain  copy     print?
  1. < item   
  2.                 android:id="@+id/ACTION_COLOR"   
  3.                 android:title="选择颜色">    
  4.                 < menu  >    
  5.                         < group  >    
  6.                                 < item   
  7.                                         android:id="@+id/red"   
  8.                                         android:title="红色"  />    
  9.                                 < item   
  10.                                         android:id="@+id/green"   
  11.                                         android:title="绿色"  />    
  12.                                 < item   
  13.                                         android:id="@+id/blue"   
  14.                                         android:title="蓝色"  />    
  15.                         < /group>    
  16.                 < /menu>    
  17.       < /item>    

上下文菜单:
 
ContextMenu 和OptionsMenu的区
1,   OptionsMenu 的拥有者是Activity;   ContextMenu 上下文菜单的拥有者是Activity中View
2,   每个Activity中有且只有一个OptionsMenu,它为整个Activity服务;     每个Activity中可以有多个View, 那个View需要显示上下文菜单 需要为该View注册上下文菜单registerForContextMenu(View   view);
创建方式
1, 注册上下文菜单
2, res/menu/文件中的   创建每个Item项
3, 重写父类方法:   onCreateContextMenu(ContextMenu menu,View v,ContextMenuInfo menuInfo)
/**
* 当长按View时调用

* ContextMenu menu     需要显示的上下文菜单
* View v       用户选择的View
* ContextMenuInfo menuInfo 所选择界面的额外信息
*        (Spinner,ListView,GridView)
*        携带这AdapterView 的 posotion信息
--菜单可见--
4, 实现菜单项的点击: 重写父类的方法:   onContextItemSelected(MenuItem   item)
实例:
 
[java]  view plain  copy     print?
  1. public  class  MainActivity  extends  Activity  {   
  2.         private  ListView  lv;    
  3.         private  List< String>   data  =  new  ArrayList< String> ();    
  4.         private  ArrayAdapter< String>   adapter;    
  5.         private  int  position  =  0;    
  6.         @Override   
  7.         protected  void  onCreate(Bundle  savedInstanceState)  {   
  8.                 super.onCreate(savedInstanceState);    
  9.                 setContentView(R.layout.activity_main);    
  10.                 lv  =  (ListView)  findViewById(R.id.lv);    
  11.                 for  (int  i  =  0;   i  <   20;   i++)  {   
  12.                         data.add("Item  ---> "  +  i);    
  13.                 }   
  14.                 adapter  =  new  ArrayAdapter< String> (this,   
  15.                         android.R.layout.simple_list_item_1,  data);    
  16.                 lv.setAdapter(adapter);    
  17.                 //  1,  注册上下文对象   
  18.                 registerForContextMenu(lv);    
  19.         }   
  20.         //  2,  在res/menu/中创建菜单项   
  21.         //  3,  重写父类的方法,  实现显示   
  22.         @Override   
  23.         public  void  onCreateContextMenu(ContextMenu  menu,  View  v,   
  24.                         ContextMenuInfo  menuInfo)  {   
  25.                 super.onCreateContextMenu(menu,  v,  menuInfo);    
  26.                 //  加载菜单页面   
  27.                 getMenuInflater().inflate(R.menu.main,  menu);    
  28.                 //  获取当前选中ListView的Item的下标   
  29.                 position  =  ((AdapterContextMenuInfo)  menuInfo).position;    
  30.         }   
  31.         //  4,  重写父类的方法,  实现每个菜单项的点击   
  32.         @Override   
  33.         public  boolean  onContextItemSelected(MenuItem  item)  {   
  34.    
  35.                 switch  (item.getItemId())  {   
  36.                 case  R.id.action_delete:   
  37.                         //  从数据源中移除数据   
  38.                         data.remove(position);    
  39.                         //  刷新适配器   
  40.                         adapter.notifyDataSetChanged();    
  41.                 break;    
  42.                 }   
  43.                 return  super.onContextItemSelected(item);    
  44.         }   
  45. }   
 
[html]  view plain  copy     print?
  1. < menu  xmlns:android="http://schemas.android.com/apk/res/android"  >    
  2.    
  3.         < item   
  4.                 android:id="@+id/action_delete"   
  5.                 android:orderInCategory="100"   
  6.                 android:showAsAction="never"   
  7.                 android:title="删除信息"/>    
  8.    
  9. < /menu>    
 
弹出菜单:
 
【Android--菜单详解】Popup Menu     弹出式菜单       Api 必须在11以上,   可以为任意View 创建弹出式菜单
  1, 得到PopupMenu的对象
    PopupMenu pMenu = new PopupMenu(this,位置参考的UI控件);
  2, 加载菜单
    getMenuInflater.inflat(R.menu.main,menu);
  3, 为PopupMenu设置监听器
  pMenu.setOnMenuItemClickListener(.....);
  4, 显示菜单
  pMenu.show();
实例:
[java]  view plain  copy     print?
    1. public  class  MainActivity  extends  Activity  {   
    2.         private  TextView  tv;    
    3.         @Override   
    4.         protected  void  onCreate(Bundle  savedInstanceState)  {   
    5.                 super.onCreate(savedInstanceState);    
    6.                 setContentView(R.layout.activity_main);    
    7.                 tv  =  (TextView)  findViewById(R.id.tv);    
    8.         }   
    9.         //  点击按钮弹出菜单   
    10.         public  void  change(View  v)  {   
    11.                 //  得到popup对象   
    12.                 PopupMenu  popupMenu  =  new  PopupMenu(MainActivity.this,  v);    
    13.                 //  加载菜单   
    14.                 getMenuInflater().inflate(R.menu.main,  popupMenu.getMenu());    
    15.                 //  为  popup设置监听器   
    16.                 popupMenu.setOnMenuItemClickListener(new  OnMenuItemClickListener()  {   
    17.                         @Override   
    18.                         public  boolean  onMenuItemClick(MenuItem  item)  {   
    19.                                 //  TODO  Auto-generated  method  stub   
    20.                                 switch  (item.getItemId())  {   
    21.                                 case  R.id.action_color:   
    22.                                         tv.setTextColor(Color.CYAN);    
    23.                                         break;    
    24.                                 case  R.id.action_size:   
    25.                                         tv.setTextSize(20);    
    26.                                         break;    
    27.                                 }   
    28.                                 return  false;    
    29.                         }   
    30.                 });    
    31.                 //  显示   
    32.                 popupMenu.show();    
    33.         }   
    34. }   






































































    推荐阅读