59

下面是我的活动的代码

    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>
4

8 回答 8

206

我有同样的问题,我找到了解决方案:

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);
于 2013-11-18T12:22:46.690 回答
8

菜单:

<item
    android:id="@+id/action_share"
    android:title="@string/action_share"
    app:showAsAction="ifRoom"
    app:actionProviderClass="android.support.v7.widget.ShareActionProvider"/>

爪哇:

MenuItem menuItem = menu.findItem(R.id.action_share);
mActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(menuItem);
于 2016-10-17T14:48:44.703 回答
7

您正在使用android.widget.ShareActionProvider,它用于本机 API 级别 11+ 操作栏。如果您使用的是操作栏的 AppCompat 反向移植,则需要改为使用android.support.v7.widget.ShareActionProvider

于 2013-10-01T14:03:21.287 回答
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 共享的资源类型。由于我正在共享一个文件,因此我需要使用 Uri.fromFile(new File()); 设置流。如果您正在共享文本,您将使用 setType("text/plain")。

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

于 2013-12-24T05:59:47.700 回答
1

问题是@CommonsWare 所说的关于不使用支持库 ShareActionProvider 的内容,即使我这样做了,它也不会成功,因为在使用支持库时,我们需要自定义前缀来执行某些操作,例如showAsAction

于 2013-10-15T18:02:26.777 回答
1

这是几年前问的,所以现有的答案可能在当时有效。但是,在撰写本文时,建议的代码给出了许多弃用警告,但并不能解决问题。

我最终确实解决了这个问题,并且没有在网络上的任何地方记录(我可以找到),所以希望这个答案能帮助目前遇到同样问题的人。

对我来说,解决方案是在 import 声明中。当我第一次使用 SharedActionProvider 时,Android Studio 可以自动添加导入。它为导入的内容提供了两个选项:android.widget.ShareActionProviderandroidx.appcompat.widget.ShareActionProvider.

前者被破坏并导致关于演员的错误永远不会成功。后者将使一切正常工作。菜单文件中的app:ActionProviderClass必须与导入的文件名相同。

于 2019-07-28T07:21:21.033 回答
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 替换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));
  }
于 2018-08-25T11:22:19.420 回答
0

这里的解决方案都没有解决我的 ShareActionProvider 问题,而不是强制转换/返回 null。我最终只用 Intent.SEND_ACTION 替换 ShareActionProvider 以在我的应用程序中共享图像,如 Android 开发人员教程中所述: 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 ...

于 2019-06-24T05:58:21.323 回答