4

描画アプリケーションを開発していて、ユーザーが自分の描画を電子メールやソーシャルネットワークなどで共有できるようにしたいのです。ShareActionProviderクラスがありますが、大きな問題が1つあります。

setShareIntent()アプリケーションのコンテンツが急速に更新されるため、ユーザーが描画を開始または終了するたびに電話をかけることができません。ユーザーが共有ボタンを押したときにインテントを作成する必要があることは明らかです。しかし、残念ながら、クリックリスナーなどはありません。そしてそれは問題です。

解決策はありますか?

4

4 に答える 4

4

アプリケーションにアクションバーを追加します。

次に、アクションバーに「共有」アイコンを追加できます。

<item android:id="@+id/action_share"
  android:icon="@android:drawable/ic_menu_share" ... />

public boolean onOptionsItemSelected(MenuItem item) {
  switch (item.getItemId()) {
    case R.id.action_share:
      Intent intent = new Intent(Intent.ACTION_SEND);
      intent.setType("image/jpeg");
      intent.putExtra(Intent.EXTRA_SUBJECT, "Subject text");
      intent.putExtra(Intent.EXTRA_TEXT, "Detailed description");
      intent.putExtra(Intent.EXTRA_STREAM, getPubliclyAccessibleUriOfAnImage());
      startActivity(Intent.createChooser(intent, "Share my dynamic image"));
      return true;

メニュー項目を使用することは別の解決策かもしれませんが、それはあまり流行ではありません。

于 2012-09-13T11:00:54.037 に答える
2

この答えには解決策がありません、私はあなた自身を完全に転がさずにこのタスクを不可能と評価します。

私は完全に同意します。必要なときにリスナーを使用してデータをプルする必要がありますが、同時に、インテントを処理できるアプリのみが表示されるため、このように機能します。

これは、インテントを共有する前に、インテントを提供して、<intent-filter>sにそのことを実行させ、互換性のないアクティビティをフィルタリングする必要があることを意味します。この問題は、<data>フィルターにUriとMimeTypeをフィルターする要素が含まれている場合に発生します。

これを回避してみましょう。

OnShareTargetSelectedListenerを使用する

@hannes archdoSomeStuffは何かに取り組んでいましたが、の実装となる答えから答えが欠落しています。

ああ、ブール値を返します。インテントを更新してaを実行し、それを処理したことを示すためにstartActivity(intent)戻ります。の戻り値を無視しtrueていることが判明したため、それを使用することはできません。ShareActivityChooserModelPolicyonShareTargetSelected

そうすることで、同じような内容(元の意図と変更された意図)の同じ活動が可能になります。ユーザーにはそれほど親切ではありません。

拡張するShareActionProvider

リスナーに必要なロジックを複製ShareActivityChooserModelPolicyし、リスナーから返された値を返します。このように私たちreturn trueは動作します。代わりにそうではありません。選択したアプリの履歴を保持する機能が失われます。

ShareActionProviderテイク2を延長

私は試してみましたが、厄介な反省やsetAccessible呼び出しがあっても、このクラスを拡張する方法はありません。硬すぎます。

コピーShareActionProvider

および関連するクラス。いいえ、Androidの内部クラスに依存しているため機能しません。

締めくくりの言葉

何だろう

動作は拡張可能であり、ShareActionProviderの拡張機能は、履歴ファイルに基づいてさまざまな動作とランク付けを実行できます(適切な場合)。

https://developer.android.com/guide/topics/ui/actionbar.htmlからの意味

于 2014-09-15T17:17:59.407 に答える
1

これが私のやり方です

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

    MenuItem actionItem = menu.findItem(R.id.mymenu_item);
    ShareActionProvider actionProvider = (ShareActionProvider) actionItem.getActionProvider();
    actionProvider.setShareHistoryFileName(ShareActionProvider.DEFAULT_SHARE_HISTORY_FILE_NAME);       actionProvider.setOnShareTargetSelectedListener(new ShareActionProvider.OnShareTargetSelectedListener() {

    public boolean onShareTargetSelected(ShareActionProvider source,
                Intent intent) {
            doSomeStuff();//TODO
            return false;
    }} );
    actionProvider.setShareIntent(createShareIntent());

    MenuItem overflowItem = menu.findItem(R.id.mymenu_item);
    ShareActionProvider overflowProvider = (ShareActionProvider) overflowItem.getActionProvider();
    overflowProvider.setShareHistoryFileName(ShareActionProvider.DEFAULT_SHARE_HISTORY_FILE_NAME);
    overflowProvider.onPerformDefaultAction();
    overflowProvider.setShareIntent(createShareIntent());

    return super.onCreateOptionsMenu(menu);
}
于 2013-01-29T13:24:40.763 に答える
0

android.support.v7.app.ActionBarActivity派生物で同様の問題が発生し(このアプローチはどのアクティビティでも機能するはずですが)、onPrepareOptionsMenuをオーバーライドして、次のような効果が得られました。

private ShareActionProvider actionProvider;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.mymenu, menu);

    // get the share menu item
    MenuItem actionItem = menu.findItem(R.id.share_menu_item);
    actionProvider = (ShareActionProvider) actionItem.getActionProvider();

    return true;
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    if (actionProvider != null) {
        actionProvider.setShareIntent(createShareIntent());
    }
    return super.onPrepareOptionsMenu(menu);
}

private Intent createShareIntent() {
    // ripped from @nicolas-raoul answer
    Intent intent = new Intent(Intent.ACTION_SEND);
    intent.setType("image/jpeg");
    intent.putExtra(Intent.EXTRA_SUBJECT, "Subject text");
    intent.putExtra(Intent.EXTRA_TEXT, "Detailed description");
    intent.putExtra(Intent.EXTRA_STREAM, getPubliclyAccessibleUriOfAnImage());
    return intent;
}

参照:フラグメント内のAndroid setShareIntent

于 2014-11-01T16:20:55.033 に答える