ShareCompatとActionProvider

2013-01-01T00:00:00+00:00 Android Java

Android4.x系からはShareActionProviderとかあるんすけど、それを使わずにActionProviderを使ってShareCompatで共有の処理を実装する方法

ちなみに元々参考として http://dev.classmethod.jp/smartphone/android/android-tips-35-sharecompat

(ここでは書かないけど<menu>でandroid:actionProviderClassを指定しておく。ちなみに今回staticクラスになる)

package sample.test;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.ShareCompat;
import android.view.ActionProvider;
import android.view.Menu;
import android.view.View;

public class MainActivity extends Activity {

    private static Activity mActivity;

    @Override
    public void onCreate(Bundle bundle) {
        super.onCreate(bundle);

        mActivity = this;
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.actionbar, menu);

        return true;
    }

    public static class ShareActionProvider extends ActionProvider {

        public ShareActionProvider(Context context) {
            super(context);
        }

        @Override
        public View onCreateActionView() {
            return null;
        }

        @Override
        public boolean onPerformDefaultAction() {
            ShareCompat.IntentBuilder builder = ShareCompat.IntentBuilder.from(mActivity);
            builder.setText("hoge fuga foobar");
            builder.setChooserTitle("title");
            builder.setType("text/*");
            builder.startChooser();

            return super.onPerformDefaultAction();
        }
    }
}

staticクラスにしなくてもmenuなXMLでandroid:actionProviderClassを定義せずに

MenuItem menuItem = menu.findItem(R.id.menu_share);
menuItem.setActionProvider(new ActionProvider(this) {

    @Override
    public View onCreateActionView() {
        return null;
    }

    @Override
    public boolean onPerformDefaultAction() {
        ShareCompat.IntentBuilder builder = ShareCompat.IntentBuilder.from(mActivity);
        builder.setText("hoge fuga foobar");
        builder.setChooserTitle("title");
        builder.setType("text/*");
        builder.startChooser();

        return super.onPerformDefaultAction();
    }
});

という風に扱っても良い。つかstaticクラスでグダるよりはandroid:actionProviderClassを指定せずに、自前でActionProviderなインスタンス作ってActivityなクラスのインスタンスを渡すような感じでコンストラクタなりを作れば良い

んまぁandroid.widget.ShareActionProviderがどうも趣に合わないような場合だとこういう感じで書けなくも無さそう

Linuxでのjava.util.prefs.Preferences gradleでselenium