Android--菜单详解

Posted chenxibobo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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>  

 

弹出菜单:

 

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. }  





































































以上是关于Android--菜单详解的主要内容,如果未能解决你的问题,请参考以下文章

Android的菜单栏Menu用法详解(超详细)

android官方侧滑菜单DrawerLayout详解

Android onKeyDown事件详解

android studio 的下拉菜单Spinner使用详解

Android 中实现上下文菜单(Context menu)详解

Android SlidingMenu 使用详解