我正在开发一个绘图应用程序,我希望允许用户在电子邮件、社交网络等中分享他的绘图。我知道,有一个ShareActionProvider类,但它存在一个大问题。
我的应用程序内容更新迅速,因此我无法在setShareIntent()
每次用户开始或结束绘图时调用。很明显,当用户按下分享按钮时应该创建意图。但是,不幸的是,没有点击监听器或类似的东西。这是一个问题。
有什么解决办法吗?
我正在开发一个绘图应用程序,我希望允许用户在电子邮件、社交网络等中分享他的绘图。我知道,有一个ShareActionProvider类,但它存在一个大问题。
我的应用程序内容更新迅速,因此我无法在setShareIntent()
每次用户开始或结束绘图时调用。很明显,当用户按下分享按钮时应该创建意图。但是,不幸的是,没有点击监听器或类似的东西。这是一个问题。
有什么解决办法吗?
将操作栏添加到您的应用程序。
然后你可以在操作栏中添加一个“分享”图标:
<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 项目可能是另一种解决方案,但它不是很时髦。
这个答案没有解决方案,如果不完全滚动你自己,我认为这个任务是不可能的。
我完全同意,它应该在需要时使用侦听器提取数据,但同时它以这种方式工作,因为它只显示可以处理意图的应用程序。
这意味着您必须在能够共享它之前提供意图,让<intent-filter>
s 做他们的事情并过滤不兼容的活动。当过滤器包含<data>
过滤 Uri 和 MimeType 的元素时,就会出现问题。
让我们尝试解决这个问题。
@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
这是我的方式
@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);
}
我在 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;
}