ActionBarに共有履歴を追加する


Android4.0(以降ICS)のActionBarには、共有ボタンで共有機能を使用したことのあるアプリのアイコンを、ActionBarのMenuItemに追加することができるようになりました。

詳細は以下から。

共有履歴をActionBarに追加するために今回は以下の流れに沿って解説します。

  • 共有履歴を表示するスペースの確保
  • ShareActionProviderの設定

まずは共有したアプリのMenuItemを格納するための領域をmenuのレイアウトファイルで確保します。

共有履歴を表示するスペースの確保

action_bar_action_provider.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:id="@+id/menu_item_share_action_provider_action_bar"
        android:showAsAction="always"
        android:title="@string/action_bar_share_with"
        android:actionProviderClass="android.widget.ShareActionProvider" />

    <item android:id="@+id/menu_item_share_action_provider_overflow"
        android:showAsAction="never"
        android:title="@string/action_bar_share_with"
        android:actionProviderClass="android.widget.ShareActionProvider" />

</menu>

3〜6行目は最初から表示しておく共有機能のMenuItemです。

8〜11行目が一度使用した共有先アプリを記憶するためのMenuItemです。

ポイントはandroid:actionProviderClass属性にandroid.widget.ShareActionProviderを指定することです。
ShareActionProviderクラスを使用するためにはこの記述が必要です。
ShareActionProviderクラスはICSから追加されたクラスで、MenuItemで共有された各IntentのActionを管理するための機能を提供します。
また、ShareActionProviderクラスはActionごと、データの種類(テキスト、画像等)ごとに作成することができ、それぞれの共有の履歴をActionBarに表示させることが可能です。

ShareActionProviderの設定

次にコードで、ShareActionProviderに共有するIntentのActionの指定、共有アプリの履歴の保存先の指定を行います。

Actionbar.java

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // menuファイルの読み込み
    getMenuInflater().inflate(R.menu.action_bar_action_provider, menu);
    MenuItem actionItem = menu.findItem(R.id.menu_item_share_action_provider_action_bar);

    ShareActionProvider actionProvider = (ShareActionProvider) actionItem.getActionProvider();
    actionProvider.setShareHistoryFileName(ShareActionProvider.DEFAULT_SHARE_HISTORY_FILE_NAME);

    Intent shareIntent = new Intent(Intent.ACTION_SEND);
    shareIntent.setAction(Intent.ACTION_SEND);
    shareIntent.setType("text/plain");
    shareIntent.putExtra(Intent.EXTRA_TEXT, "aaa");
    actionProvider.setShareIntent(shareIntent);

    MenuItem overflowItem = menu.findItem(R.id.menu_item_share_action_provider_overflow);
    ShareActionProvider overflowProvider =
        (ShareActionProvider) overflowItem.getActionProvider();
    overflowProvider.setShareHistoryFileName(
        ShareActionProvider.DEFAULT_SHARE_HISTORY_FILE_NAME);

    overflowProvider.setShareIntent(shareIntent);

    return true;
}

ShareActionProviderクラスの設定はonCreateOptionsMenu内で行います。

5〜8行目と14行目は最初から表示させておくMenuItemで、17〜22行目は共有履歴を表示するためのMenuItemです。

ではgetActionProviderメソッドを使用してMenuItemのShareActionProviderインスタンスを取得しています。
ここで取得したShareActionProviderインスタンスに対して、共有履歴の保存先と共有するIntentのActionを指定していきます。

8行目では共有履歴の保存先ファイル名をsetShareHistoryFileNameメソッドで指定しています。
setShareHistoryFileNameメソッドの引数には保存先のファイル名を指定します。
基本的にはShareActionProvider#DEFAULT_SHARE_HISTORY_FILE_NAME定数に保持されているファイル名で問題ありません。
19〜20行目では上記と同じ内容を共有履歴を表示するためのMenuItemに設定しています。

14行目ではShareActionProviderインスタンスに共有するIntentを指定しています。
サンプルではActionがIntent#ACTION_SEND、データが”text/plain”の受け口を持っているアプリへ共有できるようにしています。
22行目では上記と同じ内容を共有履歴を表示するためのMenuItemに設定しています。

3 Comments