为什么MenuItemCompat.getActionProvider返回null?

我试图在我的应用程序的操作栏上使用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> 

这里是我的代码来创build共享操作button:

 @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. 当我评论这些行时,分享button出现在栏上,但是在点击时不做任何事情,如何解决(如果问题1无法解决)?

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

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

在这里,这是使ShareActionProvider不为空的唯一解决scheme…我使用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中,把这一行放在你activity的标签属性中:

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

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

在我的情况下,它在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使用下划线进行通知。

确保你的类扩展了AppCompatActivity,而不仅仅是Activity。

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

如果有人想继续使用代码,

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

只需要添加到proguard

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

经过一些阅读,其中可能包括一些你的反应,最后这个问题解决了:

  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。 inheritance自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. 的build.gradle
    4.1。 在我的情况下,只是为了保持安全的一面,我打开了debugging中的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命名空间。 我知道这不是你的问题,但有些人可能会像我一样到达你的职位,而不是看到,所以我只是想发现它;)

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

我的问题是在ProGuard中。 closuresProGuard解决了我的问题。

尝试添加到单位的活动

 import android.support.v4.view.MenuItemCompat; 

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

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

这与我做了诡计…我刚刚创build了我自己的shareactionprovider! 和我自己设置,然后得到它…也许theres一些代码甚至不需要..但它的很多铸造,并确保你使用正确的,所有的时间,如果你只是键入“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 }