Exception: This is not supported, use MenuItemCompat.getActionProvider()
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".
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;
}
Related videos on Youtube
micsha123
Updated on June 06, 2022Comments
-
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)
-
EWit over 9 yearsPlease include the stacktrace of the error.
-
Moshi almost 8 yearsclassroom.udacity.com/courses/ud853/lessons/1474559101/concepts/… Check bottom of this page "Diff for this note" section. It specifically says to use "android.support.v7.widget.ShareActionProvider"
-
-
micsha123 over 9 yearsYes, you're right! I missed information from official Android Developer site, that use android.widget.ShareActionProvider for API >=14. Thanks!
-
ban-geoengineering over 8 yearsThe 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 over 7 yearsThis is great help. Keep an eye out in main_menu.xml that for actionProviderClass its also using the support v7 version.