why MenuItemCompat.getActionProvider returns null?

In my case it was wrong namespace in 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"/>

Pay attention to app:actionProviderClass="android.support.v7.widget.ShareActionProvider": it should have

  • correct package (android.widget android.support.v7.widget)
  • correct namespace (android app).

Unfortunatelly, the compiler compiles it without errors, only Android Studio makes notification with underlining.


If someone wants to keep progaurd on and still use the code:

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

Just need to add to proguard:

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

Here this is the only solution that works to make ShareActionProvider not null...i use set ActionProvider instead...see the code below:

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

and...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>

and other things that may be checked:

the activity has to extends ActionBarActivity:

MyActivity extends ActionBarActivity

check and use this imports:

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;

In AndroidManifest.xml put this line in your activity's tag attributes:

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

If you dont know how to import v7 and v4 compatibility libraries see: http://developer.android.com/tools/support-library/setup.html


Make sure that your class extends AppCompatActivity instead of just Activity.

Note: Edited to reflect the updated app compat library.