time 
设为首页】【收藏本站
当前位置: 主页 > 电脑网络 > 操作系统 > 嵌入式 > Android > Android ActionBar完全解析之使用官方推荐的最佳导航栏(下)

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

时间:2014-06-20 16:00 点击:6990次 字体:[ ]




限于篇幅的原因,在上篇文章中我们只学习了ActionBar基础部分的知识,那么本篇文章我们将接着上一章的内容继续学习,探究一下ActionBar更加高级的知识。如果你还没有看过前面一篇文章的话,建议先去阅读http://www.fengfly.com/plus/view-215121-1.html

添加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就可以了。代码如下所示:

  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完全解析之使用官方推荐的最佳导航栏(下)_www.fengfly.com
 

细心的你一定观察到了,这个ShareActionProvider点击之后是可以展开的,有点类似于overflow的效果,这就是Action Provider的子菜单。除了使用ShareActionProvider之外,我们也可以自定义一个Action Provider,比如说如果想要建立一个拥有两项子菜单的Action Provider,就可以这样写:

  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的声明:

  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="com.example.actionbartest.MyActionProvider" 
  8.         android:icon="@drawable/ic_launcher" 
  9.         android:showAsAction="ifRoom" 
  10.         android:title="@string/action_share" /> 
  11.     ......  
  12.  
  13. </menu> 

现在重新运行一下代码,结果如图所示:

 

Android ActionBar完全解析之使用官方推荐的最佳导航栏(下)_www.fengfly.com
 



本文地址 : http://www.fengfly.com/plus/view-215123-1.html
标签: Android ActionBar
------分隔线----------------------------
最新评论 查看所有评论
发表评论 查看所有评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码: