25

我尝试在我的应用程序的操作栏上使用 android.support.v7.widget.ShareActionProvider。所以我按照 android 文档中的示例进行操作,但遇到了一些问题。
这是我的菜单xml:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:myapp="http://schemas.android.com/apk/res-auto" >

    <item
        android:id="@+id/action_share"
        android:orderInCategory="100"
        android:icon="@drawable/ic_action_share"
        android:title="@string/action_share"
        myapp:showAsAction="ifRoom"
        myapp:actionProviderClass="android.support.v7.widget.ShareActionProvider" />

</menu>

这是我创建共享操作按钮的代码:

@Override
public void onCreateOptionsMenu (Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.share, menu);
    MenuItem shareItem = menu.findItem(R.id.action_share);
    ShareActionProvider mShareActionProvider = (ShareActionProvider)MenuItemCompat.getActionProvider(shareItem);
    mShareActionProvider.setShareIntent(getDefaultIntent());
    super.onCreateOptionsMenu(menu, inflater);
}

我的问题是:

  1. MenuItemCompat.getActionProvider(shareItem) 总是为我返回 null,这是为什么呢?
  2. 当我评论这些行时,共享按钮出现在栏上,但单击时什么也不做,如何解决(如果问题 1 无法解决)?

顺便说一句,我检查了 MenuItemCompat.getActionProvider 的代码,看起来此方法将检查菜单项是否实现 SupportMenuItem 接口,如果不是则返回失败。我该怎么处理?

4

12 回答 12

20

就我而言,这是错误的命名空间menu.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto">
  <item android:id="@+id/menu_item_share"
        app:actionProviderClass="android.support.v7.widget.ShareActionProvider"/>

注意app:actionProviderClass="android.support.v7.widget.ShareActionProvider":应该有

  • 正确的android.widget android.support.v7.widget
  • 正确的命名空间android 应用程序)。

不幸的是,编译器编译它没有错误,只有 Android Studio 用下划线发出通知。

于 2015-09-16T08:00:55.527 回答
19

如果有人想继续progaurd使用代码:

ShareActionProvider mShareActionProvider = (ShareActionProvider)MenuItemCompat.getActionProvider(shareItem);

只需要添加到proguard

-keep class android.support.v7.widget.ShareActionProvider { *; }
于 2015-08-23T13:51:51.460 回答
17

这是使 ShareActionProvider 不为空的唯一解决方案...我使用 set ActionProvider 代替...请参阅下面的代码:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.messages_activity_menu, menu);
    MenuItem menuItem = menu.findItem(R.id.menu_item_share);
    shareActionProvider = new ShareActionProvider(this);
    MenuItemCompat.setActionProvider(menuItem, shareActionProvider);

    return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    if(item.getItemId() == R.id.menu_item_share){
        onShareAction();
    }

    return super.onOptionsItemSelected(item);
}

private void onShareAction(){
    // Create the share Intent
    String playStoreLink = "https://play.google.com/store/apps/details?id=" + getPackageName();
    String yourShareText = getResources().getString(R.string.share_text) + playStoreLink;
    Intent shareIntent = ShareCompat.IntentBuilder.from(this).setType("text/plain").setText(yourShareText).getIntent();
    // Set the share Intent
    if (shareActionProvider != null) {
        shareActionProvider.setShareIntent(shareIntent);
    }
}

和...xml

 <?xml version="1.0" encoding="utf-8"?>
 <menu xmlns:android="http://schemas.android.com/apk/res/android" >
     <item
    android:id="@+id/menu_item_share"
    android:icon="@drawable/ic_action_share"
    android:showAsAction="ifRoom|withText"
    android:title="@string/menu_item_share" />
 </menu>

以及其他可能需要检查的事项:

活动必须扩展 ActionBarActivity:

MyActivity extends ActionBarActivity

检查并使用此导入:

import android.support.v4.app.ShareCompat;
import android.support.v4.view.MenuItemCompat;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBar.OnNavigationListener;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.widget.ShareActionProvider;

在 AndroidManifest.xml 中,将此行放入您活动的标记属性中:

android:theme="@style/Theme.AppCompat.Light"

如果您不知道如何导入 v7 和 v4 兼容库,请参阅:http: //developer.android.com/tools/support-library/setup.html

于 2014-02-07T14:44:09.220 回答
12

确保您的类扩展 AppCompatActivity 而不仅仅是 Activity。

注意:已编辑以反映更新的应用兼容库。

于 2013-10-23T03:40:27.980 回答
11

经过一些阅读,其中可能包括你们中的一些回复,最后这个问题得到了解决:

  1. Share_Menu.xml。确保您有一个自定义命名空间,并且 actionProvider 类来自该自定义命名空间以及正确的值:android.support.v7.widget.ShareActionProvider

    <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:myapp="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/action_share" android:title="@string/action_detail_share" myapp:showAsAction="always" myapp:actionProviderClass="android.support.v7.widget.ShareActionProvider"></item> </menu>

  2. Detail_Activity.java
    2.1。继承自ActionBarActivity而不是 Activity
    2.2。添加正确的导入

    import android.support.v4.app.Fragment; import android.support.v4.view.MenuItemCompat; import android.support.v7.app.ActionBarActivity; import android.support.v7.widget.ShareActionProvider;

  3. AndroidManifest.xml 添加 android:theme=" @style/Theme.AppCompat.Light "

    <activity android:name=".detail_activity" android:label="@string/title_activity_detail_activity" android:theme="@style/Theme.AppCompat.Light" android:parentActivityName=".main_activity" >

  4. 构建.gradle
    4.1。就我而言,为了安全起见,我在 Debug 中关闭了 ProGuard

    debug { runProguard false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' }

4.2. 确保您在依赖项中有以下编译部分

`compile 'com.android.support:appcompat-v7:20.0.+'` 
于 2014-09-28T00:52:51.613 回答
1

我有同样类型的错误。MenuItemCompat.getActionProvider 返回 null。

我的问题出在 ProGuard 中。关闭 ProGuard 为我解决了这个问题。

于 2014-01-19T18:09:02.240 回答
1

我的应用程序中有相同的 nullPointer 问题。正如@josh527 所说,我忘记为我的应用程序定义一个自定义 xml 命名空间。我知道这不是您的问题,但是有些人可能会像我一样到达您的帖子而看不到,所以我只是想发现它;)

于 2013-12-27T15:24:50.837 回答
0

尝试添加到活动单元

import android.support.v4.view.MenuItemCompat;

我有同样的问题,这是解决方案。

于 2014-11-03T11:46:56.263 回答
0

变量:Android.Support.V7.Widget.ShareActionProvider shareActionProvider;

this.MenuInflater.Inflate(Resource.Menu.share_action_provider, menu);
var shareItem = menu.FindItem(Resource.Id.menu_item_share_action_provider_action_bar);
MenuItemCompat.SetShowAsAction (shareItem,  MenuItemCompat.ShowAsActionIfRoom);
var actionprov = new Android.Support.V7.Widget.ShareActionProvider (this);
MenuItemCompat.SetActionProvider (shareItem, actionprov);
var test =  MenuItemCompat.GetActionProvider (shareItem);
shareActionProvider = test.JavaCast<Android.Support.V7.Widget.ShareActionProvider>();
var intent = new Intent(Intent.ActionSend);
intent.SetType("text/plain");
intent.PutExtra(Intent.ExtraText, "ActionBarCompat is Awesome! Support Lib v7 #Xamarin");
shareActionProvider.SetShareIntent (intent);
return base.OnCreateOptionsMenu(menu); 

这对我有用......我刚刚创建了我自己的 shareactionprovider !我自己设置它,然后得到它......也许有一些代码甚至不需要......但它有很多转换并确保你一直使用正确的,如果你只是输入“ShareActionProvider”你是实际上使用V4 ..!而不是V7

于 2015-01-13T15:06:14.343 回答
0

对于 Android Pie,动作提供者类再次发生了变化:

app:actionProviderClass="androidx.appcompat.widget.ShareActionProvider"
于 2019-06-27T14:46:04.363 回答
0

您应该更改 onCreateOptionsMenu 函数的声明和定义。您已经更改了基类的函数声明。这意味着该方法未被覆盖。

尝试这个 :

@Override
public boolean onCreateOptionsMenu (Menu menu) {

    inflater.inflate(R.menu.share, menu);// declare a local layout inflater
    MenuItem shareItem = menu.findItem(R.id.action_share);
    ShareActionProvider mShareActionProvider = (ShareActionProvider)MenuItemCompat.getActionProvider(shareItem);
    mShareActionProvider.setShareIntent(getDefaultIntent());
//    super.onCreateOptionsMenu(menu, inflater);   <--- Remove this line or put in the first line because base class constructor should be called in the first line of the method.

return super.onCreateOptionsMenu(menu);//<-- Add this line to set the menu after adding menu items
}
于 2016-04-12T16:10:22.853 回答
0

还有另一个潜在的相关问题。如果您的 MenuItem 始终存在于 ActionBar 中,请使用以下代码:

menuItem?.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS) 

生成的菜单项将不起作用(它将可见,但未启用)。有两个选项,要么更改 ShowAsAction 类型,要么直接在 onCreateOptionsMenu() 函数中调用 setShareIntent:

this@MyAwesomeActivity.runOnUiThread(java.lang.Runnable {
     actionProvider.setShareIntent(shareIntent)
})
于 2019-07-09T14:47:45.363 回答