Añadiendo una acción de compartir

Esta lección te enseñará a

  1. Actualizar declaraciones de menú
  2. Establecer la intención de compartir

También deberías leer

Con la inclusión de ActionProvider en Android 4.0 (nivel API 14) es aún más sencillo implementar una acción de compartir efectiva y amigable en tu ActionBar. Una vez asociado a un elemento de menú de la barra de acciones, el ActionProvider gestiona tanto la apariencia como el comportamiento de ese elemento. En el caso de ShareActionProvider, sólo necesitamos proporcionarle una intención de compartir y este se encargará del resto.

Nota:  ShareActionProvider sólo está disponible en el nivel API 14 y superiores.

Figura 1. El ShareActionProvider en la aplicación de Galería.

Actualizar declaraciones de menú


Para empezar a trabajar con ShareActionProviders, necesitamos definir el atributo android:actionProviderClass para el <item> correspondiente en nuestro archivo de recurso de menú:

<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>

Esto delega la responsabilidad de la apariencia y el funcionamiento del elemento al ShareActionProvider. Además, también necesitaremos indicar al proveedor qué queremos compartir.

Establecer la intención de compartir


Para que funcione el ShareActionProvider, debemos proporcionarle una intención de compartir. Esta intención debería ser igual a la que describimos en la lección Enviando contenido a otras aplicaciones, con la acción ACTION_SEND y los datos adicionales definidos mediante extras como EXTRA_TEXT y EXTRA_STREAM. Para asignar una intención de compartir, primero necesitas obtener el MenuItem correspondiente una vez procesado el recurso de menú en tu Activity o Fragment. Después, llama a MenuItem.getActionProvider() para obtener una instancia de ShareActionProvider. Utiliza setShareIntent() para actualizar la intención de compartir asociada con el elemento de acción. Aquí hay un ejemplo:

private ShareActionProvider mShareActionProvider;
...

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Procesamos el archivo de recurso de menú.
    getMenuInflater().inflate(R.menu.share_menu, menu);

    // Obtenemos el MenuItem asociado al ShareActionProvider
    MenuItem item = menu.findItem(R.id.menu_item_share);

    // Obtenemos y almacenamos el ShareActionProvider
    mShareActionProvider = (ShareActionProvider) item.getActionProvider();

    // Devolvemos true para mostrar el menú
    return true;
}

// Se llama para actualizar la intención de compartir
private void setShareIntent(Intent shareIntent) {
    if (mShareActionProvider != null) {
        mShareActionProvider.setShareIntent(shareIntent);
    }
}

Puede que sólo necesites establecer la intención de compartir una única vez, durante la creación de tus menús, o puedes querer establecerla y actualizarla al cambiar la interfaz de usuario. Por ejemplo, cuando estás viendo fotografías en pantalla completa en la aplicación de Galería, la intención de compartir cambia al desplazarte entre las fotografías.

Para una discusión más amplia acerca del objeto ShareActionProvider, consulta la guía de la Action Bar.