Добавление простого обмена данными

Реализаций эффективного и удобного действия "поделиться" в ActionBar стало еще проще с введением ActionProvider в Android 4.0 (API Уровень 14). ActionProvider, сразу после присоединения к пункту меню в панели действий, обрабатывает как внешний вид, так и поведение этого элемента. В случае ShareActionProvider, вы предоставляете намерение "обмена" и он сделает все остальное.

Примечание: ShareActionProvider доступен начиная с Уровня API 14 и выше.

Рисунок 1. ShareActionProvider в приложении Галерея.

Обновление объявления меню

Чтобы начать работу с ShareActionProviders, определите android:actionProviderClass атрибут для соответствующего <item> в вашем ресурс меню файле:

<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 функционировал, необходимо предоставить намерение для обмена. Это намерение должно быть такими же, как описано в Отправка простых данных в другие приложения уроке, с действием ACTION_SEND и дополнительными данными установленных с помощью EXTRA_TEXT и EXTRA_STREAM. Чтобы назначить намерение обмена, сначала найдите соответствующий MenuItem в своем ресурсе меню в вашем Activity или Fragment. Далее, вызовите MenuItem.getActionProvider() для получения экземпляра ShareActionProvider. Используйте setShareIntent() для обновления намерения обмена, связанного с этим элементом действия. Вот пример:

private ShareActionProvider mShareActionProvider;
...

@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);
    }
}

Возможно, вам необходимо установить намерение обмена только один раз, во время создания вашего меню, или же вы можете установить его, а затем обновлять его по мере изменений пользовательского интерфейса. Например, при просмотре фотографий в полноэкранном режиме в приложении Галерея, намерение обмена изменяется, когда вы переключаетесь между фотографиями.

Дальнейшего обсуждения ShareActionProvider объекта, см. Панель действий.