这几天小马在看官方文档的时候看到了有关系统级菜单Menu的文档,因为大家平时用的时候只是实现了两个方法来创建上下文菜单,小马也是的,特此写下这篇文章以备朋友们学习交流,供不时之用,吼吼,还有哦,今天是大年夜(代码是小马提前写的,一边看晚会一边发贴的,呵呵),小马祝大家:新年快乐,家人平安健康

    我们一般创建Menu菜单的时候是用以下方法:


  1. @Override 
  2.     public boolean onCreateOptionsMenu(Menu menu) { 
  3.         super.onCreateOptionsMenu(menu); 
  4.         return true
  5.     } 
  6.      
  7.     @Override 
  8.     public boolean onOptionsItemSelected(MenuItem item) { 
  9.         return false
  10.     } 

下面先看下小马的效果图,代码附效果图下:

方式一:普通方法实现的菜单

 

方式二:ActionProvider实现的效果

 

 

ActionProvider实现菜单项代码如下:

 


  1. package com.xiaomaguo.www.test; 
  2.  
  3. import android.app.Activity; 
  4. import android.content.Context; 
  5. import android.content.Intent; 
  6. import android.provider.Settings; 
  7. import android.view.ActionProvider; 
  8. import android.view.LayoutInflater; 
  9. import android.view.Menu; 
  10. import android.view.MenuItem; 
  11. import android.view.View; 
  12. import android.widget.ImageButton; 
  13. import android.widget.Toast; 
  14.  
  15. /**   
  16. * @Title: ActionBarSettingsActionProviderActivityActivity.java 
  17. * @Package com.xiaomaguo.www.test 
  18. * @Description: 系统级各类MENU菜单学习 
  19. * @author MZH 
  20. */ 
  21. public class ActionBarSettingsActionProviderActivityActivity extends Activity { 
  22.       
  23.     /** 
  24.      * 这个方法不用多介绍,创建菜单 
  25.      */ 
  26.     @Override 
  27.     public boolean onCreateOptionsMenu(Menu menu) { 
  28.         super.onCreateOptionsMenu(menu); 
  29.         //下面这个方法getMenuInflater()是从一个XML文件加载上下文菜单 
  30.         getMenuInflater().inflate(R.menu.action_bar_settings_action_provider, menu); 
  31.         return true
  32.     } 
  33.      
  34.     /** 
  35.      * 给菜单加选中事件 
  36.      */ 
  37.     @Override 
  38.     public boolean onOptionsItemSelected(MenuItem item) { 
  39.         //这里我们只简单的弹出一个提示,如果朋友们想知道自己单击了Menu的哪一项,可以item取Menu的id就可以啦,吼吼  
  40.         Toast.makeText(this, R.string.action_bar_settings_action_provider_no_handling, 
  41.                 Toast.LENGTH_SHORT).show(); 
  42.         return false
  43.     } 
  44.  
  45.      
  46.     /** 
  47.      *  
  48.      * @Title: ActionBarSettingsActionProviderActivityActivity.java 
  49.      * @Package com.xiaomaguo.www.test 
  50.      * @Description: 完成中转实现 
  51.      * @author MZH 
  52.      * ActionProvider这个类的官方文档如下: 
  53.      * This class is a mediator for accomplishing a given task,  
  54.      * for example sharing a file. It is responsible for creating 
  55.      *  a view that performs an action that accomplishes the task.  
  56.      *  This class also implements other functions such a performing a default action 
  57.      *  译文为: 
  58.      *      这个类是关于完成给定的任务的中介,例如共享一个文件。负责创建一个视图,执行一个动作,完成这项任务, 
  59.      *      这个类也可以实现其它的功能例如:默认动作的实现,吼吼 
  60.      */ 
  61.     public static class SettingsActionProvider extends ActionProvider { 
  62.  
  63.         /** 这个意图是用来显示系统级设置的. */ 
  64.         private static final Intent sSettingsIntent = new Intent(Settings.ACTION_SETTINGS); 
  65.  
  66.         /** Context for accessing resources. */ 
  67.         private final Context mContext; 
  68.  
  69.         /** 
  70.          * 构造方法 
  71.          */ 
  72.         public SettingsActionProvider(Context context) { 
  73.             super(context); 
  74.             mContext = context; 
  75.         } 
  76.  
  77.         /** 
  78.          *重写ActionProvider类的方法,实现创建新的View 
  79.          */ 
  80.         @Override 
  81.         public View onCreateActionView() { 
  82.             // Inflate the action view to be shown on the action bar. 
  83.             LayoutInflater layoutInflater = LayoutInflater.from(mContext); 
  84.             //从XML文件加载一个菜单布局 
  85.             View view = layoutInflater.inflate(R.layout.action_bar_settings_action_provider, null); 
  86.             ImageButton button = (ImageButton) view.findViewById(R.id.button); 
  87.             button.setOnClickListener(new View.OnClickListener() { 
  88.                 @Override 
  89.                 public void onClick(View v) { 
  90.                     mContext.startActivity(sSettingsIntent); 
  91.                 } 
  92.             }); 
  93.             return view; 
  94.         } 
  95.  
  96.         /** 
  97.          * 创建一个可选或默认的动作 
  98.          */ 
  99.         @Override 
  100.         public boolean onPerformDefaultAction() { 
  101.             mContext.startActivity(sSettingsIntent); 
  102.             return true
  103.         } 
  104.     } 

     下面主要来看下菜单菜Menu文件代码,这个地方小马讲下,就是很奇怪的一点,官方文档上讲改变android:showAsAction值应该有变化的,可是小马改了,好像没看到太多变化,还有大家注意的一点,如果在ActionBar上面的选项如果超过两项时,多余的项的会自动添充到浮动的Menu中,不会因为项的项数很多页自动收缩到ActionBar哦,下面来看下代码:


  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <menu xmlns:android="http://schemas.android.com/apk/res/android" > 
  3.  
  4.     <!-- 这个地方小马总共就写了几个菜单项 以此来做为简单的示范: 
  5.            因为选项都一样,小马就主要讲下里面的属性: 
  6.          android:showAsAction :这个属性的值总共有五个一一对应分别为: 
  7.          ifRoom -> SHOW_AS_ACTION_IF_ROOM 
  8.          never  -> SHOW_AS_ACTION_NEVER 
  9.          always ->  SHOW_AS_ACTION_ALWAYS 
  10.          withtext -> SHOW_AS_ACTION_WITH_TEXT 
  11.          collapseActionView -> SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW 
  12.            因为文档中这四个选项的解释比较多,小马就不一一贴出来啦,想了解的朋友们可以跟下小马下面的链接: 
  13.          http://developer.android.com/reference/android/view/MenuItem.html#SHOW_AS_ACTION_IF_ROOM 
  14.           
  15.           还有这个选项,在文档中也并不存在,写了还不报错 android:actionProviderClass  奇怪 
  16.     --> 
  17.     <item 
  18.         android:id="@+id/menu_item_action_provider_action_bar" 
  19.         android:actionProviderClass="com.example.android.apis.app.ActionBarSettingsActionProviderActivity$SettingsActionProvider" 
  20.         android:showAsAction="collapseActionView" 
  21.         android:title="@string/action_bar_settings"/> 
  22.     <item 
  23.         android:id="@+id/menu_item_action_provider_overflow" 
  24.         android:actionProviderClass="com.example.android.apis.app.ActionBarSettingsActionProviderActivity$SettingsActionProvider" 
  25.         android:showAsAction="ifRoom" 
  26.         android:title="@string/action_bar_settings"/> 
  27.     <item 
  28.         android:id="@+id/menu_item_action_provider_overflow2" 
  29.         android:actionProviderClass="com.example.android.apis.app.ActionBarSettingsActionProviderActivity$SettingsActionProvider" 
  30.         android:showAsAction="ifRoom" 
  31.         android:title="@string/action_bar_settings"/> 
  32.     <item 
  33.         android:id="@+id/menu_item_action_provider_overflow3" 
  34.         android:actionProviderClass="com.example.android.apis.app.ActionBarSettingsActionProviderActivity$SettingsActionProvider" 
  35.         android:showAsAction="ifRoom" 
  36.         android:title="@string/action_bar_settings"/> 
  37.  
  38. </menu> 

    这篇文章是小马在学习菜单时参考官方文档记录的笔记,希望用到的时候可以查下自己的博客,有能用到的朋友们可以收藏下咯,吼吼,如果文章中有什么错误的地方,希望朋友们直接指出,批评小马的编码坏习惯,有错立马改,谢谢,最后,附上小DEMO的源码,有不足之外,大家多多见谅呀,嘿嘿