无法将操作提供者转换为共享操作提供程序

以下是我的活动的代码

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> 

我有同样的问题,我find了解决办法:

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); 

您正在使用android.widget.ShareActionProvider ,该API用于本机API Level 11+操作栏。 如果您正在使用操作栏的AppCompat backport,则需要使用android.support.v7.widget.ShareActionProvider

菜单:

 <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); 

我遇到了这个问题下面的Android开发工具栏指南 ,这基本上是你在做什么。 在挖掘到使用向后兼容的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; } 

在这里需要注意的是,你不是从菜单资源中膨胀。 该菜单将添加默认的共享button。 您只需指定与.setType共享的资源types即可。 由于我共享文件,我需要setStream,与Uri.fromFile(新的File()); 如果你是共享文本,你会setType(“文本/平原”)。

还要确保你已经导入了包含所需软件包的$ SDK \ extras \ android \ support \ v7 \ appcompat库项目。 另外,因为已经导入了该库项目,所以您的项目不需要libs文件夹中的v4support.jar,因为库项目已经有了它。

问题是@CommonsWare有关不使用支持库ShareActionProvider的说法,即使我做了也不会做出来,因为当使用支持库时,我们需要自定义前缀来执行一些操作,例如showAsAction