用ShareActionProvider添加一个简单的共享事件

在ActionBar中添加分享功能会使得应用更加高效友好。Android4.0(API等级14)引入的ActionProvider类使得分享功能变得更加的简单。一旦ActionProvider被绑定到Action Bar的一个菜单中,它就能处理那一项的显示和反应。在ShareActionProvider的实例中,只需提供分享的Intent,其他的会被ShareActionProvider自行处理。

**注意:**ShareActionProvider出现在API等级14或者更高版本的SDK中

更新菜单项

actionbar-shareaction.png

图1 Gallery应用中的ShareActionProvider

从ShareActionProvider开始。在menu resource 文件对应的中定义 android:actionProviderClass属性。

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/menu_item_share"
        android:showAsAction="ifRoom"
        android:title="Share"
        android:actionProviderClass="android.widget.ShareActionProvider" />
    ...
</menu>

这就将菜单项的外观和功能委托给了ShareActionProvider,但是应该告知ShareActionProvider那些是要被分享的。

设置分享intent

为了使ShareActionProvider发挥功能,必须提供一个分享的Intent.这个Intent必须和在Sending Content to Other Apps中描述的Intent一致(使用ACTION SEND,通过EXTRA TEXT、EXTRA STREAM添加数据)。部署一个分享的Intent,首先填充菜单时,要在Activity或者Fragment中找到对应的菜单项,然后调用MenuItem.getActionProvider()获得ShareActionProvider的实例。使用setShareIntent()更新和活动项相关的分享Intent。示例如下:

private ShareActionProvider mShareActionProvider;
...
  
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    //填充菜单
    getMenuInflater().inflate(R.menu.share_menu, menu);
  
    //定位使用ShareActionProvider的菜单项
    MenuItem item = menu.findItem(R.id.menu_item_share);
  
    // 获取和存储 ShareActionProvider
    mShareActionProvider = (ShareActionProvider) item.getActionProvider();
  
    //返回true,显示菜单
    return true;
}
  
// 更新 分享Intent
private void setShareIntent(Intent shareIntent) {
    if (mShareActionProvider != null) {
        mShareActionProvider.setShareIntent(shareIntent);
    }
}

也许只要当创建菜单是需要设置分享Intent,或者当UI发生变化时设置并更新分享Intent。比如在Gallery应用中全屏观看图片,当在图片之间点击是,分享Intent就会发生变化。

关于ShareActionProvider的进一步讨论,查看Action Bar