Android的Menu菜单详解(二)

    Android主要提供了两周创建菜单的方式,一种是在Java代码中创建(即调用Menu、SubMenu类中的方法实现菜单/子菜单/菜单项的创建);另外一种就是使用XML资源文件来定义。对于第一种方法,我们在上一篇文章中已经有了很详细的介绍,但是在Java代码中定义菜单、菜单项而导致程序代码非常臃肿且不易调试阅读。本文将着重介绍使用XML资源文件来定义菜单的构成( 即利用XML资源文件来描述一个菜单),使用这种方式只需要为每个菜单或菜单项分配一个ID,以便在事件响应方法中通过判定ID实现对应的组件响应(相当于第一种方法中的标识)。特点:有利于扩展,可维护性降低。
一、Menu中XML资源文件构成
    菜单资源文件通常应放在/res/menu目录下,菜单的XML资源文件,主要有三个重要的元素:<menu../> <item../><group../>,其中菜单资源的根元素通常是<menu../>元素,并且<menu../>元素无须指定任何属性。
下面我们着重介绍三个元素的作用:
1.<menu../>元素:用于定义一个菜单/子菜单。<menu../>元素主要有两个作用,一是整个菜单资源的根元素,将相当于布局文件中的<LinearLayout../>;二是,当Menu菜单包含子菜单时,<menu../>元素是该子菜单的根元素。
举例:创建一个菜单项
     <menu>
            <item../>
    </menu>
2.<item../>元素:用于定义一个菜单项/子菜单项。有如下常用属性。
    (1)android:id:为菜单项指定一个唯一的标识,用于事件响应判定;
    (2)android:title:设置(子)菜单项标题;
    (3)android:icon:设置菜单项图标;
    (4)android:checkable:设置该菜单项是否可选
    (5)android:checked:设置该菜单项是否已经选中
    (6)android:visible:设置菜单项是否可见
    (7)android:enable:设置菜单项是否可用
    (8)android:alphabeticShortcut/numbericShortcut:为菜单项指定字符/数字快捷键
3.<group../>元素:用于创建一组菜单项,在创建一个子菜单时使用。常用属性:
    android:checkableBehavior:设置所属子菜单项是单选还是多选(值为"single"等)
举例:创建一个子菜单,并且包含三个子菜单项。
       <menu>                   //菜单
             <item...>            //一个菜单项
                      <menu>     //子菜单
                            <group  android:checkableBehavior=“single”>
                                    <item../>        //子菜单项1
                                    <item../>       //子菜单项2
                                    <item../>        //子菜单项3
                     </menu>
            </item>
    </menu>
二、Menu菜单开发基本思路
1.创建XML资源文件(在res/menu/menu.xml),为每个菜单项或子菜单项定义一个ID---构建菜单外观;
2.重写Activity的onCreateOptionsMenu(Menu menu)(适用Menu菜单)或者onCreateContextMenu(ContextMenu menu,View source,ContextMenuInfo menuIfo)(适用上下文菜单)的方法,在该方法里调用Menu对象的方法来添加菜单项或者子菜单;
3.在onCreateOptionsMenu(Menu menu)或者onCreateContextMenu(ContextMenu menu,View source,ContextMenuInfo menuIfo)中调用 MenuInflaterinfate(R.menu.*,menu)方法,装填XML资源文件对应的菜单(如R.menu.menu.xml),并添加到 menu菜单或者上下文菜单中;
  1. MenuInflater inflator=new MenuInflater(this);   //实例化一个MenuInflater对象  
  2. inflator.inflate(R.menu.menu, menu);     //将xml对应的菜单资源添加到menu中  
2.重写Activity的onCreateOptionsMenu(Menu menu)(适用Menu菜单)或者onContextItemSelected(MenuItem mi)(适用于上下文菜单)的方法,通过菜单项标识符( 菜单项ID)来判定该响应哪一个菜单项。
三、源代码
    由于布局文件只有一个文本框,故无需给出。
1.menu菜单XML资源文件:res/menu/menu.xml
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <menu xmlns:android="http://schemas.android.com/apk/res/android">  
  3.   
  4.     <!-- 第一个菜单项:字体大小菜单-->  
  5.     <item android:title="@string/font_size"  
  6.           android:icon="@drawable/font">  
  7.           <menu>  
  8.               <!-- 定义一组单选菜单项 ,然后定义一组菜单选项-->  
  9.               <group android:checkableBehavior="single">  
  10.                   <item   
  11.                       android:id="@+id/font_10"  
  12.                       android:title="@string/font_10"/>  
  13.                   <item   
  14.                       android:id="@+id/font_12"  
  15.                       android:title="@string/font_12"/>  
  16.                   <item   
  17.                       android:id="@+id/font_14"  
  18.                       android:title="@string/font_14"/>  
  19.                   <item   
  20.                       android:id="@+id/font_16"  
  21.                       android:title="@string/font_16"/>  
  22.                   <item   
  23.                       android:id="@+id/font_18"  
  24.                       android:title="@string/font_18"/>  
  25.               </group>  
  26.           </menu>  
  27.      </item>  
  28.             
  29.     <!-- 第二个菜单项:普通菜单-->       
  30.      <item  
  31.          android:id="@+id/plain_item"  
  32.          android:title="@string/palin_item">  
  33.      </item>  
  34.        
  35.     <!-- 第三个菜单项:字体颜色-->  
  36.     <item  
  37.         android:title="@string/font_color"  
  38.         android:icon="@drawable/color">  
  39.        <!-- 定义一组单选菜单项 ,然后定义一组菜单选项-->  
  40.        <menu>  
  41.         <group>  
  42.             <item  
  43.                 android:id="@+id/red_font"  
  44.                 android:title="@string/red_title"/>  
  45.             <item  
  46.                 android:id="@+id/blue_font"  
  47.                 android:title="@string/blue_title"/>  
  48.             <item  
  49.                 android:id="@+id/green_font"  
  50.                 android:title="@string/blue_title"/>  
  51.         </group>  
  52.       </menu>  
  53.     </item>         
  54. </menu>           
2.文本框上下文菜单:res/menu/context.xml
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <menu xmlns:android="http://schemas.android.com/apk/res/android">  
  3.     <!-- 定义一组单选菜单项 ,然后定义一组菜单选项-->  
  4.     <group android:checkableBehavior="single">  
  5.         <item  
  6.             android:id="@+id/red"  
  7.             android:title="@string/red_title"  
  8.             android:alphabeticShortcut="r"/>  
  9.         <item  
  10.             android:id="@+id/blue"  
  11.             android:title="@string/blue_title"  
  12.             android:alphabeticShortcut="b"/>  
  13.         <item  
  14.             android:id="@+id/green"  
  15.             android:title="@string/green_title"  
  16.             android:alphabeticShortcut="g"/>  
  17.     </group>  
  18. </menu>     
3.MainActivity.java源文件
  1. package com.android.android_menu_xml;  
  2.   
  3. //import android.support.v7.app.ActionBarActivity;  
  4. import android.app.Activity;  
  5. import android.graphics.Color;  
  6. import android.os.Bundle;  
  7. import android.view.ContextMenu;  
  8. import android.view.Menu;  
  9. import android.view.MenuInflater;  
  10. import android.view.MenuItem;  
  11. import android.view.View;  
  12. import android.widget.TextView;  
  13. import android.widget.Toast;  
  14.   
  15.   
  16. public class MainActivity extends Activity {  
  17.     private TextView text;  
  18.     @Override  
  19.     protected void onCreate(Bundle savedInstanceState) {  
  20.         super.onCreate(savedInstanceState);  
  21.         //获取文本视图控件,并向其注册一个上下文才菜单  
  22.         setContentView(R.layout.main);  
  23.         text=(TextView)findViewById(R.id.txt);  
  24.         registerForContextMenu(text);  
  25.     }  
  26.     //1.创建Menu菜单 ,将menu.xml资源添加到menu中  
  27.     public boolean onCreateOptionsMenu(Menu menu)  
  28.     {  
  29.         MenuInflater inflator=new MenuInflater(this);   //实例化一个MenuInflater对象  
  30.         inflator.inflate(R.menu.menu, menu);            //将xml对应的菜单资源添加到menu中  
  31.         return super.onCreateOptionsMenu(menu);   
  32.     }  
  33.     //2.创建上下文才菜单,将context.xml资源添加到contextmenu中  
  34.     public void onCreateContextMenu(ContextMenu menu,View source,ContextMenu.ContextMenuInfo menuInfo)  
  35.     {  
  36.           
  37.         MenuInflater inflator=new MenuInflater(this);   //实例化一个MenuInflater对象  
  38.         inflator.inflate(R.menu.context, menu);         //将xml对应的菜单资源添加到menu中  
  39.         menu.setHeaderIcon(R.drawable.color);           //设置上下文菜单图标  
  40.         menu.setHeaderTitle("请选择背景颜色");             //设置上下文菜单标题  
  41.     }  
  42.     //3.响应上下文菜单项  
  43.     public boolean onContextItemSelected(MenuItem menutem)  
  44.     {  
  45.         menutem.setChecked(true);       //勾选该菜单选项  
  46.         switch(menutem.getItemId())     //获取触发的菜单项id,响应  
  47.         {  
  48.             case R.id.red:          //调用TextView的setBackgroundColor方法设置背景颜色  
  49.                 menutem.setChecked(true);  
  50.                 text.setBackgroundColor(Color.RED);  
  51.                 break;  
  52.             case R.id.blue:  
  53.                 menutem.setChecked(true);  
  54.                 text.setBackgroundColor(Color.BLUE);  
  55.                 break;  
  56.             case R.id.green:          
  57.                 menutem.setChecked(true);  
  58.                 text.setBackgroundColor(Color.GREEN);  
  59.                 break;  
  60.         }  
  61.         return true;      
  62.     }  
  63.     //4.响应Menu菜单项  
  64.     public boolean onOptionsItemSeleted(MenuItem mi)  
  65.     {  
  66.         if(mi.isCheckable())  
  67.         {  
  68.             mi.setChecked(true);  
  69.         }  
  70.         switch(mi.getItemId()) //获取菜单项Id,并做出响应  
  71.         {  
  72.             //设置字体大小  
  73.             case R.id.font_10:  
  74.                 text.setTextSize(10*2);  
  75.                 break;  
  76.             case R.id.font_12:  
  77.                 text.setTextSize(12*2);  
  78.                 break;  
  79.             case R.id.font_14:  
  80.                 text.setTextSize(14*2);  
  81.                 break;  
  82.             case R.id.font_16:  
  83.                 text.setTextSize(16*2);  
  84.                 break;  
  85.             case R.id.red:  
  86.                 text.setTextSize(18*2);  
  87.                 break;  
  88.             //设置字体颜色  
  89.             case R.id.red_font:  
  90.                 mi.setChecked(true);  
  91.                 text.setTextColor(Color.RED);  
  92.                 break;  
  93.             case R.id.blue_font:  
  94.                 text.setTextColor(Color.BLUE);  
  95.                 mi.setChecked(true);  
  96.                 break;  
  97.             case R.id.green_font:  
  98.                 text.setTextColor(Color.GREEN);  
  99.                 mi.setChecked(true);  
  100.                 break;  
  101.             //设置普通菜单响应  
  102.             case R.id.plain_item:  
  103.                 Toast toast=Toast.makeText(MainActivity.this"您单击了普通菜单", Toast.LENGTH_SHORT);  
  104.                 toast.show();  
  105.                 break;    
  106.         }  
  107.         return super.onOptionsItemSelected(mi);  
  108.     }  
  109. }  
效果如下:
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值