page.title=Adding an Easy Share Action
parent.title=Sharing Content
parent.link=index.html

trainingnavtop=true
previous.title=Receiving Simple Data from Other Apps
previous.link=receive.html

@jd:body

<div id="tb-wrapper">
<div id="tb">

<!-- table of contents -->
<h2>This lesson teaches you to</h2>
<ol>
  <li><a href="#update-menus">Update Menu Declarations</a></li>
  <li><a href="#set-share-intent">Set the Share Intent</a></li>
</ol>

<!-- other docs (NOT javadocs) -->
<h2>You should also read</h2>
<ul>
  <li><a href="{@docRoot}guide/topics/ui/actionbar.html">Action Bar</a></li>
</ul>

</div>
</div>


<p>Implementing an effective and user friendly share action in your {@link android.app.ActionBar}
is made even easier with the introduction of {@link  android.view.ActionProvider} in Android 4.0
(API Level 14). An {@link android.view.ActionProvider}, once attached to a menu item in the action
bar, handles both the appearance and behavior of that item. In the case of {@link
android.widget.ShareActionProvider}, you provide a share intent and it does the rest.</p>

<p class="note"><strong>Note:&nbsp;</strong> {@link android.widget.ShareActionProvider} is available
starting with API Level 14 and higher.</p>


<div class="figure" style="width:200px">
<img src="{@docRoot}images/ui/actionbar-shareaction.png" alt="" id="figure1" />
<p class="img-caption">
  <strong>Figure 1.</strong> The {@link android.widget.ShareActionProvider} in the Gallery app.
</p>
</div>

<h2 id="update-menus">Update Menu Declarations</h2>

<p>
    To get started with {@link android.widget.ShareActionProvider ShareActionProviders},
    define the <code>android:actionProviderClass</code> attribute for the corresponding
    <code>&lt;item&gt;</code> in your <a href="{@docRoot}guide/topics/resources/menu-resource.html"
    >menu resource</a> file:</p>

<pre>
&lt;menu xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;&gt;
    &lt;item
            android:id=&quot;@+id/menu_item_share&quot;
            android:showAsAction=&quot;ifRoom&quot;
            android:title=&quot;Share&quot;
            <b>android:actionProviderClass=
                "android.widget.ShareActionProvider"</b> /&gt;
    ...
&lt;/menu&gt;
</pre>

<p>
    This delegates responsibility for the item's appearance and function to
    {@link android.widget.ShareActionProvider}. However, you will need to tell the provider what you
    would like to share.
</p>


<h2 id="set-share-intent">Set the Share Intent</h2>

<p>
    In order for {@link android.widget.ShareActionProvider} to function, you must provide it a share
    intent. This share intent should be the same as described in the
    <a href="{@docRoot}training/sharing/send.html">Sending Simple Data to Other Apps</a> lesson,
    with action {@link android.content.Intent#ACTION_SEND} and additional data set via extras
    like {@link android.content.Intent#EXTRA_TEXT} and {@link android.content.Intent#EXTRA_STREAM}.
    To assign a share intent, first find the corresponding {@link android.view.MenuItem} while
    inflating your menu resource in your {@link android.app.Activity} or
    {@link android.app.Fragment}. Next, call {@link android.view.MenuItem#getActionProvider
    MenuItem.getActionProvider()} to retrieve an instance of
    {@link android.widget.ShareActionProvider}. Use
    {@link android.widget.ShareActionProvider#setShareIntent(android.content.Intent)
    setShareIntent()} to update the share intent associated with that action item. Here's an
    example:
</p>

<pre>
private ShareActionProvider mShareActionProvider;
...

&#64;Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate menu resource file.
    getMenuInflater().inflate(R.menu.share_menu, menu);

    // Locate MenuItem with ShareActionProvider
    MenuItem item = menu.findItem(R.id.menu_item_share);

    // Fetch and store ShareActionProvider
    mShareActionProvider = (ShareActionProvider) item.getActionProvider();

    // Return true to display menu
    return true;
}

// Call to update the share intent
private void setShareIntent(Intent shareIntent) {
    if (mShareActionProvider != null) {
        mShareActionProvider.setShareIntent(shareIntent);
    }
}
</pre>

<p>You may only need to set the share intent once during the creation of your menus, or you may
want to set it and then update it as the UI changes. For example, when you view photos full screen
in the Gallery app, the sharing intent changes as you flip between photos.</p>

<p>For further discussion about the {@link android.widget.ShareActionProvider} object, see the <a
href="{@docRoot}guide/topics/ui/actionbar.html#ActionProvider">Action Bar</a> guide.</p>


