Android ActionBar完全解析,使用官方推荐的最佳导航栏(下)

古之立大事者,不惟有超世之才,亦必有坚忍不拔之志。这篇文章主要讲述Android ActionBar完全解析,使用官方推荐的最佳导航栏(下)相关的知识,希望能为你提供帮助。
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/25466665



本篇文章主要内容来自于Android  Doc,我翻译之后又做了些加工,英文好的朋友也可以直接去读原文。
http://developer.android.com/guide/topics/ui/actionbar.html


限于篇幅的原因,在上篇文章中我们只学习了ActionBar基础部分的知识,那么本篇文章我们将接着上一章的内容继续学习,探究一下ActionBar更加高级的知识。如果你还没有看过前面一篇文章的话,建议先去阅读Android ActionBar完全解析,使用官方推荐的最佳导航栏(上)。


添加Action Provider
和Action View有点类似,Action Provider也可以将一个Action按钮替换成一个自定义的布局。但不同的是,Action Provider能够完全控制事件的所有行为,并且还可以在点击的时候显示子菜单。


为了添加一个Action Provider,我们需要在< item> 标签中指定一个actionViewClass属性,在里面填入Action Provider的完整类名。我们可以通过继承ActionProvider类的方式来创建一个自己的Action Provider,同时,android也提供好了几个内置的Action Provider,比如说ShareActionProvider。


由于每个Action Provider都可以自由地控制事件响应,所以它们不需要在onOptionsItemSelected()方法中再去监听点击事件,而是应该在onPerformDefaultAction()方法中去执行相应的逻辑。


那么我们就先来看一下ShareActionProvider的简单用法吧,编辑menu资源文件,在里面加入ShareActionProvider的声明,如下所示:
[html]  view plain  copy

  1. < menu  xmlns:android="http://schemas.android.com/apk/res/android"   
  2.         xmlns:tools="http://schemas.android.com/tools"   
  3.         tools:context="com.example.actionbartest.MainActivity"  >    
  4.    
  5.         < item   
  6.                 android:id="@+id/action_share"   
  7.                 android:actionProviderClass="android.widget.ShareActionProvider"   
  8.                 android:showAsAction="ifRoom"   
  9.                 android:title="@string/action_share"  />    
  10.         ......   
  11.    
  12. < /menu>    
注意,ShareActionProvider会自己处理它的显示和事件,但我们仍然要记得给它添加一个title,以防止它会在overflow当中出现。

接着剩下的事情就是通过Intent来定义出你想分享哪些东西了,我们只需要在onCreateOptionsMenu()中调用MenuItem的getActionProvider()方法来得到该ShareActionProvider对象,再通过setShareIntent()方法去选择构建出什么样的一个Intent就可以了。代码如下所示:
[java]  view plain  copy
  1. @Override   
  2. public  boolean  onCreateOptionsMenu(Menu  menu)  {   
  3.         MenuInflater  inflater  =  getMenuInflater();    
  4.         inflater.inflate(R.menu.main,  menu);    
  5.         MenuItem  shareItem  =  menu.findItem(R.id.action_share);    
  6.         ShareActionProvider  provider  =  (ShareActionProvider)  shareItem.getActionProvider();    
  7.         provider.setShareIntent(getDefaultIntent());    
  8.         ......   
  9.         return  super.onCreateOptionsMenu(menu);    
  10. }   
  11.    
  12. private  Intent  getDefaultIntent()  {   
  13.         Intent  intent  =  new  Intent(Intent.ACTION_SEND);    
  14.         intent.setType("image/*");    
  15.         return  intent;    
  16. }   
可以看到,这里我们通过getDefaultIntent()方法来构建了一个Intent,该Intent表示会将所有可以共享图片的程度都列出来。重新运行一下程序,效果如下图所示:


Android ActionBar完全解析,使用官方推荐的最佳导航栏(下)

文章图片




细心的你一定观察到了,这个ShareActionProvider点击之后是可以展开的,有点类似于overflow的效果,这就是Action Provider的子菜单。除了使用ShareActionProvider之外,我们也可以自定义一个Action Provider,比如说如果想要建立一个拥有两项子菜单的Action Provider,就可以这样写:
[java]  view plain  copy
  1. public  class  MyActionProvider  extends  ActionProvider  {   
  2.            
  3.         public  MyActionProvider(Context  context)  {   
  4.                 super(context);    
  5.         }   
  6.    
  7.         @Override   
  8.         public  View  onCreateActionView()  {   
  9.                 return  null;    
  10.         }   
  11.    
  12.         @Override   
  13.         public  void  onPrepareSubMenu(SubMenu  subMenu)  {   
  14.                 subMenu.clear();    
  15.                 subMenu.add("sub  item  1").setIcon(R.drawable.ic_launcher)   
  16.                                 .setOnMenuItemClickListener(new  OnMenuItemClickListener()  {   
  17.                                         @Override   
  18.                                         public  boolean  onMenuItemClick(MenuItem  item)  {   
  19.                                                 return  true;    
  20.                                         }   
  21.                                 });    
  22.                 subMenu.add("sub  item  2").setIcon(R.drawable.ic_launcher)   
  23.                                 .setOnMenuItemClickListener(new  OnMenuItemClickListener()  {   
  24.                                         @Override   
  25.                                         public  boolean  onMenuItemClick(MenuItem  item)  {   
  26.                                                 return  false;    
  27.                                         }   
  28.                                 });    
  29.         }   
  30.    
  31.         @Override   
  32.         public  boolean  hasSubMenu()  {   
  33.                 return  true;    
  34.         }   
  35.    
  36. }   
这里我们新建了一个MyActionProvider继承自ActionProvider,为了表示这个Action Provider是有子菜单的,需要重写hasSubMenu()方法并返回true,然后在onPrepareSubMenu通过调用SubMenu的add()方法添加子菜单。

【Android ActionBar完全解析,使用官方推荐的最佳导航栏(下)】接着修改menu资源,在里面加入MyActionProvider的声明:
[html]  view plain  copy
  1. < menu  xmlns:android="http://schemas.android.com/apk/res/android"   
  2.         xmlns:tools="http://schemas.android.com/tools"   
  3.         tools:context="com.example.actionbartest.MainActivity"  >    
  4.    
  5.         < item   

    推荐阅读