Exception: This is not supported, use MenuItemCompat.getActionProvider()

17,536

Solution 1

First, you cannot use android.widget.ShareActionProvider with the appcompat-v7 action bar backport (e.g., ActionBarActivity). Either use the appcompat-v7 version of ShareActionProvider, or move everything over to the native action bar.

Second, if you stick with appcompat-v7, then you cannot safely use getActionProvider(), as that method will not exist on API Level 10 and below. Replace menuItem.getActionProvider() with MenuItemCompat.getActionProvider(menuItem).

FWIW, here is a sample project that implements the appcompat-v7 edition of ShareActionProvider.

Solution 2

You can follow the pattern in Code Sample from Google in link below. https://github.com/googlesamples/android-ActionBarCompat-ShareActionProvider

The easiest way is to go to your Android Studio => File, Import Sample. Then type in "Share Action Provider".

enter image description here

Below are the code involved in creating Share Action Menu Item with ShareActionProvider with ActionBarCompat, backwards compatible to API v7.

MainActivity.java

// BEGIN_INCLUDE(get_sap)
@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);

    // Get the ViewPager's current item position and set its ShareIntent.
    int currentViewPagerItem = ((ViewPager) findViewById(R.id.viewpager)).getCurrentItem();
    setShareIntent(currentViewPagerItem);

    return super.onCreateOptionsMenu(menu);
}
// END_INCLUDE(get_sap

private void setShareIntent(int position) {
    // BEGIN_INCLUDE(update_sap)
    if (mShareActionProvider != null) {
        // Get the currently selected item, and retrieve it's share intent
        ContentItem item = mItems.get(position);
        Intent shareIntent = item.getShareIntent(MainActivity.this);

        // Now update the ShareActionProvider with the new share intent
        mShareActionProvider.setShareIntent(shareIntent);
    }
    // END_INCLUDE(update_sap)
}

main_menu.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:support="http://schemas.android.com/apk/res-auto">

<!--
  To use ShareActionProvider provided by ActionBarCompat, 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" />

Solution 3

Follow following steps:

Step.1) To add a "share" action to your activity, put a ShareActionProvider in the app bar's menu resource. Like this

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

Please note the actionProviderClass

Step.2) Now you make sure that in your Activity Java Class you import same ShareActionProvider

import android.support.v7.widget.ShareActionProvider;

Step.3)
Below section for onCreate methond

        MenuInflater inflater = getMenuInflater();

        inflater.inflate(R.menu.main_activity_bar, menu);

        ShareActionProvider shareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(menu.findItem(R.id.actionbar_share));
        shareActionProvider.setShareIntent(shareIt());

Intent method

    private Intent shareIt() {
        Intent intent= new Intent(Intent.ACTION_SEND);
        intent.setType("text/plain");

        String shareMsgBody = "Hello, Share this with world !!";

        intent.putExtra(Intent.EXTRA_TEXT, shareAndPromotionBody);
        startActivity(Intent.createChooser(intent, "Spread the message!!"));
        return intent;
    }
Share:
17,536

Related videos on Youtube

micsha123
Author by

micsha123

Updated on June 06, 2022

Comments

  • micsha123
    micsha123 almost 2 years

    I'm trying to make "Share" button in Action Bar of Android Application. Here my code:

    import android.content.Intent;
    import android.os.Bundle;
    import android.support.v4.app.Fragment;
    import android.support.v7.app.ActionBarActivity;
    import android.view.LayoutInflater;
    import android.view.Menu;
    import android.view.MenuInflater;
    import android.view.MenuItem;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ShareActionProvider;
    import android.widget.TextView;
    

    and fragment part:

    {
    private String mForecastText;
    
    public PlaceholderFragment() {
        setHasOptionsMenu(true);
    }
    
    private Intent sharedIntentMaker(){
        Intent shareIntent = new Intent(Intent.ACTION_SEND);
        shareIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
        shareIntent.setType("text/plain");
        shareIntent.putExtra(Intent.EXTRA_TEXT, mForecastText + "#SunshineApp");
        return shareIntent;
    }
    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.menu_detail, menu);
        MenuItem menuItem = menu.findItem(R.id.menu_action_share);
        ShareActionProvider mShareActionProvider = (ShareActionProvider) menuItem.getActionProvider();
        mShareActionProvider.setShareIntent(sharedIntentMaker());
    
    }
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_detail, container, false);
    
        TextView textIntent = (TextView) rootView.findViewById(R.id.textIntent);
        Intent intent = getActivity().getIntent();
        mForecastText = intent.getStringExtra("INT_PS");
        textIntent.setText(mForecastText);
        return rootView;
    }
    

    When I run my app on emulator or even real device, I get exception:

    AndroidRuntime﹕ FATAL EXCEPTION: main java.lang.UnsupportedOperationException: This is not supported, use MenuItemCompat.getActionProvider()
    

    and it links to onCreateOptionsMenu()'s strings:

    ShareActionProvider mShareActionProvider = (ShareActionProvider) menuItem.getActionProvider();
    mShareActionProvider.setShareIntent(sharedIntentMaker());
    

    What I'm doing wrong?

    P.S.: Stacktrace of error from logcat:

    01-11 13:03:17.490 2331-2331/com.*****.*****.***** E/AndroidRuntime﹕ FATAL EXCEPTION: main Process: com.*****.*****.*****, PID: 2331

    java.lang.UnsupportedOperationException: This is not supported, use MenuItemCompat.getActionProvider()
    
            at android.support.v7.internal.view.menu.MenuItemImpl.getActionProvider(MenuItemImpl.java:645)
            at com.project.malina.sunsine.DetailActivity$PlaceholderFragment.onCreateOptionsMenu(DetailActivity.java:70)
            at android.support.v4.app.Fragment.performCreateOptionsMenu(Fragment.java:1868)
            at android.support.v4.app.FragmentManagerImpl.dispatchCreateOptionsMenu(FragmentManager.java:1989)
            at android.support.v4.app.FragmentActivity.onCreatePanelMenu(FragmentActivity.java:276)
            at android.support.v7.app.ActionBarActivity.superOnCreatePanelMenu(ActionBarActivity.java:276)
            at android.support.v7.app.ActionBarActivityDelegate$1.onCreatePanelMenu(ActionBarActivityDelegate.java:79)
            at android.support.v7.app.ActionBarActivityDelegateBase.preparePanel(ActionBarActivityDelegateBase.java:979)
            at android.support.v7.app.ActionBarActivityDelegateBase.doInvalidatePanelMenu(ActionBarActivityDelegateBase.java:1182)
            at android.support.v7.app.ActionBarActivityDelegateBase.access$100(ActionBarActivityDelegateBase.java:79)
            at android.support.v7.app.ActionBarActivityDelegateBase$1.run(ActionBarActivityDelegateBase.java:115)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 
    
  • micsha123
    micsha123 over 9 years
    Yes, you're right! I missed information from official Android Developer site, that use android.widget.ShareActionProvider for API >=14. Thanks!
  • ban-geoengineering
    ban-geoengineering over 8 years
    The sample project is really helpful. Make sure you check out the menu xml file - github.com/commonsguy/cw-omnibus/blob/master/AppCompat/Share‌​/… - as well as the activity code - github.com/commonsguy/cw-omnibus/blob/master/AppCompat/Share‌​/… - because you may run into new problems otherwise.
  • Bundeeteddee
    Bundeeteddee over 7 years
    This is great help. Keep an eye out in main_menu.xml that for actionProviderClass its also using the support v7 version.