4

我正在开发一个绘图应用程序,我希望允许用户在电子邮件、社交网络等中分享他的绘图。我知道,有一个ShareActionProvider类,但它存在一个大问题。

我的应用程序内容更新迅速,因此我无法在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;

使用 MENU 项目可能是另一种解决方案,但它不是很时髦。

于 2012-09-13T11:00:54.037 回答
2

这个答案没有解决方案,如果不完全滚动你自己,我认为这个任务是不可能的。

我完全同意,它应该在需要时使用侦听器提取数据,但同时它以这种方式工作,因为它只显示可以处理意图的应用程序。

这意味着您必须在能够共享它之前提供意图,让<intent-filter>s 做他们的事情并过滤不兼容的活动。当过滤器包含<data>过滤 Uri 和 MimeType 的元素时,就会出现问题。

让我们尝试解决这个问题。

使用 OnShareTargetSelectedListener

@hannes arch在做某事,但答案中缺少答案,这将是doSomeStuff' 的实现。

啊,它返回布尔值,让我们更新意图并执行 astartActivity(intent)并返回true以表示我们处理了它。事实证明,它ShareActivityChooserModelPolicy忽略了 的返回值onShareTargetSelected,所以我们不能使用它。

这样做是可行的,但它会对具有不同内容(原始意图和修改后的)的相同活动开放。对用户不太友好。

延长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 回答