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

时间:2013-10-01 13:53:10

标签: android shareactionprovider

以下是我的活动的代码

    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>

8 个答案:

答案 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.ShareActionProviderandroidx.appcompat.widget.ShareActionProvider

前者已损坏,导致有关转换的错误永远不会成功。后者将使一切正常运行。菜单文件中的app:ActionProviderClass必须与导入的文件名相同。