为什么MenuItemCompat.getActionProvider返回null?

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

    

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

 @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接口,如果不是则返回失败。 我怎么处理它?

Solutions Collecting From Web of "为什么MenuItemCompat.getActionProvider返回null?"

这是唯一可以使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"?>    

和其他可以检查的事情:

活动必须扩展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中,将此行放在activity的标记属性中:

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

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

在我的情况下, menu.xml 命名空间错误的

   

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

  • 正确的android.widget android.support.v7.widget
  • 正确的命名空间android app )。

不幸的是,编译器编译它没有错误,只有Android Studio通过下划线进行通知。

如果有人想保持progaurd并仍然使用代码:

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

只需要添加到proguard

 -keep class android.support.v7.widget.ShareActionProvider { *; } 

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

注意:编辑以反映更新的应用程序compat库。

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

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

  2. Detail_Activity.java
    2.1。 从ActionBarActivityinheritance而不是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

  4. 的build.gradle
    4.1。 在我的情况下,为了保持安全,我在调试中转向ProGuard

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

4.2。 确保在依赖项中具有以下编译部分

 `compile 'com.android.support:appcompat-v7:20.0.+'` 

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

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

我的问题出在ProGuard上。 关闭ProGuard解决了它。

尝试添加到活动单位

 import android.support.v4.view.MenuItemCompat; 

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

variables: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(); 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

您应该更改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 }