以下是我的活动的代码
import android.app.Activity;
import android.os.Bundle;
import android.support.v7.widget.ShareActionProvider;
import android.view.Menu;
import android.view.MenuItem;
public class MainActivity extends Activity {
private ShareActionProvider shareAction;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
MenuItem item = menu.getItem(R.id.menu_settings);
shareAction = (ShareActionProvider) item.getActionProvider();
return true;
}
}
问题是从ActionProvider到ShareActionProvider有一个强制转换错误。为什么它是这样的 下面是activity_menu.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/menu_settings"
android:orderInCategory="100"
android:showAsAction="always"
android:title="@string/menu_settings"
android:actionProviderClass="android.widget.ShareActionProvider"
/>
</menu>
答案 0 :(得分:205)
我遇到了同样的问题,我找到了解决方案:
1)你必须使用:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:bwq="http://schemas.android.com/apk/res-auto" >
<item
android:id="@+id/menu_share"
android:title="@string/menu_share"
bwq:actionProviderClass="android.support.v7.widget.ShareActionProvider"
bwq:showAsAction="always"/>
</menu>
2)和Java
import android.support.v7.widget.ShareActionProvider;
和
// Locate MenuItem with ShareActionProvider
MenuItem item = menu.findItem(R.id.menu_share);
// Fetch and store ShareActionProvider
mShareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(item);
答案 1 :(得分:8)
菜单:
<item
android:id="@+id/action_share"
android:title="@string/action_share"
app:showAsAction="ifRoom"
app:actionProviderClass="android.support.v7.widget.ShareActionProvider"/>
的java:
MenuItem menuItem = menu.findItem(R.id.action_share);
mActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(menuItem);
答案 2 :(得分:7)
您正在使用android.widget.ShareActionProvider
,这是针对本机API Level 11+操作栏的。如果您正在使用操作栏的AppCompat backport,则需要使用android.support.v7.widget.ShareActionProvider
。
答案 3 :(得分:3)
我在android dev actionbar guide之后遇到了这个问题,这基本上就是你在做什么的。在使用向后兼容的v7和v4支持库深入研究使用操作栏的示例后,我最终使用了以下onCreateOptionsMenu()代码。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
File file = new File(mFilePath);
ShareCompat.IntentBuilder b = ShareCompat.IntentBuilder.from(this)
.setType("image/png")
.setStream(Uri.fromFile(file));
MenuItem item = menu.add("Share");
ShareCompat.configureMenuItem(item, b);
MenuItemCompat.setShowAsAction(item, MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);
return true;
}
这里要注意的一件事是你没有从菜单资源中膨胀。菜单添加了默认共享按钮。您只需要指定与.setType共享的资源类型。由于我正在共享一个文件,我需要setStream,使用Uri.fromFile(new File());如果您正在共享文本,则可以设置类型(“text / plain”)。
还要确保已导入$ SDK \ extras \ android \ support \ v7 \ appcompat库项目,其中包含所需的软件包。此外,由于已导入该库项目,因此您的项目不需要libs文件夹中的v4support.jar,因为库项目已经拥有它。
答案 4 :(得分:1)
问题在于@CommonsWare所说的不使用支持库ShareActionProvider,即使我这样做也没有解决,因为当使用支持库时,我们需要自定义前缀用于某些操作,如showAsAction
< / p>
答案 5 :(得分:0)
遵循我认为有用的简单规则
与AppCompatActivity
一起使用,
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:support="http://schemas.android.com/apk/res-auto">
<!--
To use ShareActionProvider, we reference the class by set the
support:actionProviderClass attribute with the full class name of ShareActionProvider.
-->
<item
android:id="@+id/menu_share"
android:title="@string/menu_share"
support:actionProviderClass="android.support.v7.widget.ShareActionProvider"
support:showAsAction="always" />
</menu>
您还可以将 support:actionProviderClass 替换为 app:actionProviderClass 和 support:showAsAction < / strong>和 app:showAsAction
在您的onCreateOptionsMenu()
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu resource
getMenuInflater().inflate(R.menu.main_menu, menu);
// Retrieve the share menu item
MenuItem shareItem = menu.findItem(R.id.menu_share);
// Now get the ShareActionProvider from the item
mShareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(shareItem);
//set its ShareIntent.
setShareIntent(shareIntent);
return super.onCreateOptionsMenu(menu);
}
与Activity
一起使用,
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/share"
android:actionProviderClass="android.widget.ShareActionProvider"
android:showAsAction="ifRoom"
tools:ignore="MenuTitle" />
</menu>
在您的onCreateOptionsMenu()
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.actions, menu);
ShareActionProvider share=
(ShareActionProvider)menu.findItem(R.id.share)
.getActionProvider();
share.setShareIntent(shareIntent);
return(super.onCreateOptionsMenu(menu));
}
答案 6 :(得分:0)
这里没有一个解决方案可以解决我的ShareActionProvider问题,而不是强制转换/返回null。我最终只用一个Intent.SEND_ACTION替换了ShareActionProvider,以在我的应用程序中共享图像,如Android Developers教程中所示: https://developer.android.com/training/sharing/send
尽管Google在本教程中提到:
Note: The best way to add a share action item to an ActionBar is to use ShareActionProvider, which became available in API level 14. ShareActionProvider is discussed in the lesson about Adding an Easy Share Action.
我发现仅实现Intention.SEND_ACTION更简单。不确定是否还有其他原因可以实现ShareActionProvider ...
答案 7 :(得分:0)
这是几年前被问到的,因此,现有的答案可能可以追溯到那时。但是,在撰写本文时,建议的代码给出了许多弃用警告,并且不能解决问题。
我最终解决了这个问题,并且没有在网络上的任何地方(我能找到)对此进行了文档记录,因此希望此答案将对当前遇到相同问题的人们有所帮助。
对我来说,解决方案是在import语句中。首次使用SharedActionProvider时,Android Studio可以自动添加导入。它为导入内容提供了两个选项:android.widget.ShareActionProvider
和androidx.appcompat.widget.ShareActionProvider
。
前者已损坏,导致有关转换的错误永远不会成功。后者将使一切正常运行。菜单文件中的app:ActionProviderClass
必须与导入的文件名相同。