我正在开发一个绘图应用程序,我想允许用户在电子邮件,社交网络等中分享他的绘图。我知道,有一个 ShareActionProvider 类,但是有一个一个大问题。
我的应用程序内容快速更新,因此每次用户开始或结束绘图时我都无法调用setShareIntent()
。很明显,当用户按下分享按钮时,应该创建意图。但是,遗憾的是,没有点击监听器或类似的东西。这是一个问题。
任何解决方案?
答案 0 :(得分:3)
为您的应用添加操作栏。
然后,您可以在操作栏中添加“共享”图标:
<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项目可能是另一种解决方案,但它不是很时髦。
答案 1 :(得分:2)
这个答案没有解决方案,如果不完全自己动手,我就无法评估这项任务。
我完全同意,它应该在需要时使用监听器来提取数据,但同时它以这种方式工作,因为它只显示可以处理意图的应用程序。
这意味着您必须先提供意图才能共享它,让<intent-filter>
做他们的事情并过滤不兼容的活动。当过滤器包含一个过滤Uri和MimeType的<data>
元素时会出现问题。
让我们尝试解决这个问题。
@hannes arch正在寻找某些内容,但答案中缺少答案,即doSomeStuff
的实施。
啊它返回布尔值,让我们更新意图并执行startActivity(intent)
并返回true
以表示我们处理了它。
事实证明ShareActivityChooserModelPolicy
忽略了onShareTargetSelected
的返回值,因此我们无法使用它。
这样做是有效的,但它会对不同内容(原始意图和修改过的内容)的相同活动开放。对用户不太好。
ShareActionProvider
并复制ShareActivityChooserModelPolicy
所需的逻辑并返回从侦听器返回的值。这样我们的return true
就可以了。相反,它没有。我们失去了拥有所选应用程序历史记录的能力。
ShareActionProvider
取2 我尝试过并试过,即使有令人讨厌的反思和setAccessible
调用,也没有办法扩展这个类。它太僵硬了。
ShareActionProvider
及相关课程。不,它不会工作,它有一些Android内部类依赖。
我只是想知道
行为是可扩展的,ShareActionProvider的扩展可以根据历史文件(如果适用)执行不同的行为和排名。
表示来自https://developer.android.com/guide/topics/ui/actionbar.html
答案 2 :(得分: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);
}
答案 3 :(得分: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;
}