Android按键之Menu详解

Android手机一般都有三个键,返回键、Home键、菜单键;

Android系统的菜单支持主要通过4个接口来实现。

从上图可以看出Menu是一个父类接口,它下面有两个子类一个是ContextMenu:它表示是一个上下文菜单,SubMenu表示一个子菜单。它们都可以包含一个或多个的MenuItem菜单项

Menu接口定义了两个方法来添加菜单项和添加子菜单。一个通过add()方法添加菜单项,addSubMenu()方法来添加子菜单。而SubMenu与ContextMenu继承了Munu接口的方法之外,还提供了一些的方法。比如设置菜单的标题、图标等;

开发菜单和子菜单有两种方式;一是在Activity重写的方法onCreateOptionsMenu(Menu menu)方法中调用menu对象添加,然后在重写Activity的onOptionsItemSelected来响应选择的菜单项。二是通过资源文件来定义菜单项,然后在onCreateOptionsMenu方法中加载这个xml资源。onCreateOptionsMenu方法在单击Menu键时触发。

而开发上下文菜单与上类似:分为三个步骤:一是重写onCreateContextMenu(ContextMenu menu,View source,ContextMenu.MenuInfo info)方法,然后调用registerForContextMenu(View viwe)方法为控件注册上下文菜单,最后重写onContextItemSelected(Menuitem item)来响应选择的菜单项

实例如下:

1、代码中添加: 

  1. package com.android.xiong.memu;  
  2.   
  3. import android.os.Bundle;  
  4. import android.app.Activity;  
  5. import android.app.AlertDialog;  
  6. import android.app.AlertDialog.Builder;  
  7. import android.view.ContextMenu;  
  8. import android.view.ContextMenu.ContextMenuInfo;  
  9. import android.view.Menu;  
  10. import android.view.MenuItem;  
  11. import android.view.SubMenu;  
  12. import android.view.View;  
  13. import android.widget.Button;  
  14.   
  15. public class MainActivity extends Activity {  
  16.   
  17.     // 定义菜单项的ItemId  
  18.     private final int NEWS = 00;  
  19.     private final int COLOR = 01;  
  20.     private final int FONT = 02;  
  21.     private final int RED = 001;  
  22.     private final int BULE = 002;  
  23.     private final int GREED = 003;  
  24.   
  25.     private final int BIG = 004;  
  26.     private final int SMALL = 005;  
  27.   
  28.     Builder bu;  
  29.   
  30.     Button show;  
  31.   
  32.     @Override  
  33.     protected void onCreate(Bundle savedInstanceState) {  
  34.         super.onCreate(savedInstanceState);  
  35.         setContentView(R.layout.activity_main);  
  36.         bu = new AlertDialog.Builder(this);  
  37.         show = (Button) findViewById(R.id.context);  
  38.         // 为Button注册上下文菜单  
  39.         registerForContextMenu(show);  
  40.   
  41.     }  
  42.   
  43.     // 用户单击Menu键时触发  
  44.     @Override  
  45.     public boolean onCreateOptionsMenu(Menu menu) {  
  46.         // 添加新建菜单项  
  47.         menu.add(0, NEWS, 0"新建");  
  48.         // 添加颜色子菜单  
  49.         SubMenu color = menu.addSubMenu(0, COLOR, 0"颜色");  
  50.         color.setHeaderTitle("选择颜色");  
  51.         color.add(0, RED, 0"红色");  
  52.         color.add(0, BULE, 0"蓝色");  
  53.         color.add(0, GREED, 0"绿色");  
  54.         // 添加字体的菜单  
  55.         SubMenu font = menu.addSubMenu(0, FONT, 0"字体");  
  56.         font.setHeaderTitle("选择字体");  
  57.         font.add(0, BIG, 0"大字体");  
  58.         font.add(0, SMALL, 0"小字体");  
  59.         return super.onCreateOptionsMenu(menu);  
  60.     }  
  61.   
  62.     // 当用户单击菜单项触发  
  63.     @Override  
  64.     public boolean onOptionsItemSelected(MenuItem item) {  
  65.         switch (item.getItemId()) {  
  66.         case RED:  
  67.             bu.setMessage("红色").setPositiveButton("确定"null).show();  
  68.             break;  
  69.         case BULE:  
  70.             bu.setMessage("蓝色").setPositiveButton("确定"null).show();  
  71.             break;  
  72.         case GREED:  
  73.             bu.setMessage("绿色").setPositiveButton("确定"null).show();  
  74.             break;  
  75.         case BIG:  
  76.             bu.setMessage("大号").setPositiveButton("确定"null).show();  
  77.             break;  
  78.         case SMALL:  
  79.             bu.setMessage("小号").setPositiveButton("确定"null).show();  
  80.             break;  
  81.         case NEWS:  
  82.             bu.setMessage("新建").setPositiveButton("确定"null).show();  
  83.             break;  
  84.         }  
  85.         return true;  
  86.     }  
  87.   
  88.     // 长按组件响应的上下文菜单  
  89.     @Override  
  90.     public void onCreateContextMenu(ContextMenu menu, View v,  
  91.             ContextMenuInfo menuInfo) {  
  92.         menu.add(0, RED, 0"红色");  
  93.         menu.add(0, BULE, 0"蓝色");  
  94.         menu.add(0, GREED, 0"绿色");  
  95.     }  
  96.   
  97.     // 点击上下文菜单项触发  
  98.     @Override  
  99.     public boolean onContextItemSelected(MenuItem item) {  
  100.         switch (item.getItemId()) {  
  101.         case RED:  
  102.             bu.setMessage("红色").setPositiveButton("确定"null).show();  
  103.             break;  
  104.         case BULE:  
  105.             bu.setMessage("蓝色").setPositiveButton("确定"null).show();  
  106.             break;  
  107.         case GREED:  
  108.             bu.setMessage("绿色").setPositiveButton("确定"null).show();  
  109.             break;  
  110.   
  111.         }  
  112.         return true;  
  113.     }  
  114.   
  115. }  


2、XML资源定义菜单 

  1. <menu xmlns:android="http://schemas.android.com/apk/res/android" >  
  2.     <!-- 添加菜单项 -->  
  3.     <item   
  4.         android:id="@+id/menu_news"  
  5.         android:title="@string/news"/>  
  6.     <!-- 添加子菜单 -->  
  7.     <item   
  8.         android:title="@string/color" >  
  9.         <menu>  
  10.             <!-- 单项选择 -->  
  11.             <group  android:checkableBehavior="single">  
  12.                 <!-- 选中红色 -->  
  13.                 <item android:id="@+id/color_red"  
  14.                     android:checked="true"  
  15.                     android:title="@string/red"/>  
  16.                 <item android:id="@+id/color_bule"  
  17.                     android:title="@string/bule"/>  
  18.                 <item android:id="@+id/color_greed"  
  19.                     android:title="@string/greed"/>  
  20.                   
  21.             </group>  
  22.         </menu>  
  23.         </item>  
  24.     <item   
  25.         android:title="@string/font" >  
  26.         <menu>  
  27.             <!-- 多项选择 -->  
  28.             <group  android:checkableBehavior="all">  
  29.                 <item android:id="@+id/font_big"  
  30.                     android:title="@string/big"/>  
  31.                 <item android:id="@+id/font_Small"  
  32.                     android:title="@string/small"/>  
  33.                   
  34.             </group>  
  35.         </menu>  
  36.         </item>  
  37.   
  38. </menu>  

 

    1. package com.android.xiong.menu2;  
    2.   
    3. import android.os.Bundle;  
    4. import android.app.Activity;  
    5. import android.app.AlertDialog;  
    6. import android.app.AlertDialog.Builder;  
    7. import android.view.ContextMenu;  
    8. import android.view.ContextMenu.ContextMenuInfo;  
    9. import android.view.Menu;  
    10. import android.view.MenuItem;  
    11. import android.view.View;  
    12. import android.widget.Button;  
    13.   
    14. public class MainActivity extends Activity {  
    15.   
    16.     Button show;  
    17.     Builder bu;  
    18.     @Override  
    19.     protected void onCreate(Bundle savedInstanceState) {  
    20.         super.onCreate(savedInstanceState);  
    21.         setContentView(R.layout.activity_main);  
    22.         bu = new AlertDialog.Builder(this);  
    23.         show=(Button)findViewById(R.id.bt_show);  
    24.         registerForContextMenu(show);  
    25.     }  
    26.   
    27.     @Override  
    28.     public boolean onCreateOptionsMenu(Menu menu) {  
    29.         getMenuInflater().inflate(R.menu.main, menu);  
    30.         return super.onCreateOptionsMenu(menu);  
    31.     }  
    32.   
    33.     @Override  
    34.     public boolean onOptionsItemSelected(MenuItem item) {  
    35.         switch (item.getItemId()) {  
    36.         case R.id.color_red:  
    37.             bu.setMessage("红色").setPositiveButton("确定"null).show();  
    38.             break;  
    39.         case R.id.color_bule:  
    40.             bu.setMessage("蓝色").setPositiveButton("确定"null).show();  
    41.             break;  
    42.         case R.id.color_greed:  
    43.             bu.setMessage("绿色").setPositiveButton("确定"null).show();  
    44.             break;  
    45.         case R.id.font_big:  
    46.             bu.setMessage("大号").setPositiveButton("确定"null).show();  
    47.             break;  
    48.         case R.id.font_Small:  
    49.             bu.setMessage("小号").setPositiveButton("确定"null).show();  
    50.             break;  
    51.         case R.id.menu_news:  
    52.             bu.setMessage("新建").setPositiveButton("确定"null).show();  
    53.             break;  
    54.         }  
    55.         return true;  
    56.     }  
    57.   
    58.     @Override  
    59.     public void onCreateContextMenu(ContextMenu menu, View v,  
    60.             ContextMenuInfo menuInfo) {  
    61.         getMenuInflater().inflate(R.menu.main, menu);  
    62.     }  
    63.   
    64.     @Override  
    65.     public boolean onContextItemSelected(MenuItem item) {  
    66.         switch (item.getItemId()) {  
    67.         case R.id.color_red:  
    68.             bu.setMessage("红色").setPositiveButton("确定"null).show();  
    69.             break;  
    70.         case R.id.color_bule:  
    71.             bu.setMessage("蓝色").setPositiveButton("确定"null).show();  
    72.             break;  
    73.         case R.id.color_greed:  
    74.             bu.setMessage("绿色").setPositiveButton("确定"null).show();  
    75.             break;  
    76.         case R.id.font_big:  
    77.             bu.setMessage("大号").setPositiveButton("确定"null).show();  
    78.             break;  
    79.         case R.id.font_Small:  
    80.             bu.setMessage("小号").setPositiveButton("确定"null).show();  
    81.             break;  
    82.         case R.id.menu_news:  
    83.             bu.setMessage("新建").setPositiveButton("确定"null).show();  
    84.             break;  
    85.         }  
    86.         return true;  
    87.     }  
    88.       
    89.       
    90. }  
posted @ 2014-03-09 17:44  安卓吧  阅读(18218)  评论(0编辑  收藏  举报