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)
First, you cannot use
android.widget.ShareActionProvider
with theappcompat-v7
action bar backport (e.g.,ActionBarActivity
). Either use theappcompat-v7
version ofShareActionProvider
, or move everything over to the native action bar.Second, if you stick with
appcompat-v7
, then you cannot safely usegetActionProvider()
, as that method will not exist on API Level 10 and below. ReplacemenuItem.getActionProvider()
withMenuItemCompat.getActionProvider(menuItem)
.FWIW, here is a sample project that implements the
appcompat-v7
edition ofShareActionProvider
.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
main_menu.xml
Follow following steps:
Step.1) To add a "share" action to your activity, put a
ShareActionProvider
in the app bar's menu resource. Like thisPlease note the
actionProviderClass
Step.2) Now you make sure that in your Activity Java Class you import same
ShareActionProvider
Step.3)
Below section for
onCreate
methondIntent method