LoginSignup
17

More than 5 years have passed since last update.

Androidのandroid.support.v7.app.AppCompatActivity向けアクションバーの共有の実装方法 2016年10月版

Last updated at Posted at 2016-10-24

Androidのアクションバーの共有ボタン、 ShareActionProviderまわりなのですが、
とにかく公式のドキュメントも、v4以前、v4の頃、v7の頃のいろんな時代のAPI
のサンプルが混ざっていて魔境すぎる感じになっています...。

いろいろ調べてみて2016年10月時点 Android Studio v2.2.2 現在で信用できる
ドキュメントは以下2点でした。

これ以外のドキュメントは、ウソだったり古かったりと地獄。とにかくひどい。ひどすぎる!

最終的に以上のドキュメントに忠実に実装すると、

res/menu/share_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:shareingsimpledata="http://schemas.android.com/apk/res-auto">
    <item android:id="@+id/action_share"
        android:title="@string/share"
        shareingsimpledata:showAsAction="ifRoom"
        shareingsimpledata:actionProviderClass="android.support.v7.widget.ShareActionProvider"/>
</menu>
java/com/example/sharingsimpledata/MainActivity.java
package com.example.sharingsimpledata;

import android.content.Intent;
import android.support.v4.view.MenuItemCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.ShareActionProvider;
import android.view.Menu;
import android.view.MenuItem;

  // ...

public class MainActivity extends AppCompatActivity {

  // ...

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.share_menu, menu);
        MenuItem shareItem = menu.findItem(R.id.action_share);
        ShareActionProvider myShareActionProvider = (ShareActionProvider)MenuItemCompat.getActionProvider(shareItem);

        Intent shareIntent = new Intent(Intent.ACTION_SEND);
        shareIntent.putExtra(Intent.EXTRA_TEXT, "Shared Massage Sample");
        shareIntent.setType("text/plain");
        myShareActionProvider.setShareIntent(shareIntent);

        return super.onCreateOptionsMenu(menu);
    }

  // ...

}

以上2つを追記するだけでOKです。これで共有ボタンのメニューが出てきて、共有の履歴も自動でボタンとして追加されます。

StackOverflowで検索すると出てくる onOptionsItemSelected をオーバーライドするとか、
ShareActionProvider.setOnShareTargetSelectedListener() を使って、 OnShareTargetSelectedListener を実装したインスタンスを設定するとかは全部昔のやり方です。 doShare メソッドなどを実装しなきゃいけないなんてこともないです。

教訓としては、基本的に JavaDoc のクラスコメントだけが一番信用でき、他のものは古くて使えない可能性がある、ということに尽きます。今後も公式ドキュメント、特に JavaDoc を正として追いかけて行きたいところです。良い教訓になりました。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17