ActionBar(6)操作提供器ActionProvider及以ShareActionProvider演示

本文详细介绍了Android中ActionProvider及其子类ShareActionProvider的使用方法。包括如何定义ShareActionProvider并设置共享Intent,以及如何在菜单资源文件中声明ActionProvider等关键信息。

一.ActionProvider简介

与操作视窗类似,操作提供器(由ActionProvider类定义的)用一个定制的布局代替一个操作项目,它还需要对所有这些项目行为的控制。当你在操作栏中给一个菜单项声明一个操作项目时,它不仅要一个定制的布局来控制这个菜单项的外观,而且当它在显示在溢出菜单中时,还要处理它的默认事件。无论是在操作栏中还是在溢出菜单中,它都能够提供一个子菜单。

       例如,ActionProvider的扩展类ShareActionProvider,它通过在操作栏中显示一个有效的共享目标列表来方便共享操作。与使用传统的调用ACTION_SEND类型Intent对象的操作项不同,你能够声明一个ShareActionProvider对象来处理一个操作项。这种操作提供器会保留一个带有处理ACTION_SEND类型Intent对象的应用程序的下拉列表,即使这个菜单项显示在溢出菜单中。因此,当你使用像这样的操作提供器时,你不必处理有关这个菜单项的用户事件。

要给一个操作项声明一个操作提供器,就要在菜单资源中对应的<item>元素中定义android:actionProviderClass属性,提供器要使用完整的类名。例如:

[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <menu xmlns:android="http://schemas.android.com/apk/res/android">  
  3.     <item android:id="@+id/menu_share"  
  4.           android:title="@string/share"  
  5.           android:showAsAction="ifRoom"  
  6.           android:actionProviderClass="android.widget.ShareActionProvider" />  
  7.     ...  
  8. </menu>  

       在这个例子中,用ShareActionProvider类作为操作提供器,在这里,操作提供器需要菜单项的控制,并处理它们在操作栏中的外观和行为以及在溢出菜单中的行为。你必须依然给这个菜单项提供一个用于溢出菜单的文本标题。

尽管操作提供器提供了它在溢出菜单中显示时所能执行的默认操作,但是Activity(或Fragment)也能够通过处理来自onOptionsItemSelected()回调方法的点击事件来重写这个默认操作。如果你不在这个回调方法中处理点击事件,那么操作提供器会接收onPerformDefaultAction()回调来处理事件。但是,如果操作提供器提供了一个子菜单,那么Activity将不会接收onOptionsItemSelected()回调,因为子菜单的显示替代了选择时调用的默认菜单行为。


二.ShareActionProvider演示

ActionProvider,一旦附加到一个ActionBar的菜单项后,可以同时处理此菜单项的外观和行为。在ShareActionProvider中,你只需要提供一个intent对象,剩下的操作就由它来替你完成。、

1.     更新菜单的声明:

我们在菜单资源文件里定义带有一个android:actionProviderClass 属性的item,如下的代码片段:

这个代理类负责ShareActionProvider的外观及功能。然而你仍然需要告知provider你想要分享什么东西。

2.     设置Share Intent

   使用ShareActionProvider,必须提供一个intent,同时这个intent需要声明ACTION_SEND和表示数据的extras(如EXTRA_TEXT、 EXTRA_STREAM);

   指定一个share intent时,首先要找到相应的MenuItem,同时将Activity或者是Fragment中的菜单资源展开。然后,调用MenuItem.getActionProvider()获取一个ShareActionProvider的实例,再调用setShareIntent()分享与那个action item相关联的share intent。

代码片段如下:

   需要注意是,如果一个应用程序需要接受Share Intent发送的共享数据,那么需要在该应用程序的Manifest.xml文件中定义<intent-filter/>元素,指明应用组件想要接受的intent。例如,针对上面发送的共享数据,另一个接收数据应用的Manifest.xml文件应注册intent-filter如下:

    在给应用的Manifest.xml注册相关的intent-filter后,在ShareActionProvider相关联的Action Item里将出现相应的该应用可供选择共享图标及标题;

下图为效果图:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值