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

Posted 竹山一叶

tags:

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

  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表示会将所有可以共享图片的程度都列出来。重新运行一下程序,效果如下图所示:




细心的你一定观察到了,这个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()方法添加子菜单。


接着修改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  
  6. Android ToolBar 使用完全解析

    Android ActionBar应用实战,高仿微信主界面的设计

    Android 完全隐藏状态栏方法

    ActionBar样式解析

    ActionBar样式解析

    自定义半透明Android ActionBar