J'essaye de faire le bouton "Partager" dans la barre d'action de Android. Voici mon 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;
et fragment:
{
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;
}
Lorsque j'exécute mon application sur un émulateur ou même sur un appareil réel, je reçois une exception:
AndroidRuntime﹕ FATAL EXCEPTION: main Java.lang.UnsupportedOperationException: This is not supported, use MenuItemCompat.getActionProvider()
et il est lié aux chaînes de onCreateOptionsMenu ():
ShareActionProvider mShareActionProvider = (ShareActionProvider) menuItem.getActionProvider();
mShareActionProvider.setShareIntent(sharedIntentMaker());
Qu'est-ce que je fais mal?
P.S .: Stacktrace of error from logcat:
01-11 13: 03: 17.490 2331-2331/com. *****. *****. ***** E/AndroidRuntime ﹕ EXCEPTION FATALE: Processus principal: 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)
Tout d'abord, vous ne pouvez pas utiliser Android.widget.ShareActionProvider
Avec le backport de la barre d'actions appcompat-v7
(Par exemple, ActionBarActivity
). Soit utiliser la version appcompat-v7
De ShareActionProvider
, soit déplacer le tout vers la barre d'actions native.
Deuxièmement, si vous vous en tenez à appcompat-v7
, Vous ne pouvez pas utiliser en toute sécurité getActionProvider()
, car cette méthode n'existera pas sur l'API niveau 10 et inférieur. Remplacez menuItem.getActionProvider()
par MenuItemCompat.getActionProvider(menuItem)
.
FWIW, voici un exemple de projet qui implémente l'édition appcompat-v7
De ShareActionProvider
.
Vous pouvez suivre le modèle dans l'exemple de code de Google dans le lien ci-dessous. https://github.com/googlesamples/Android-ActionBarCompat-ShareActionProvider
Le moyen le plus simple consiste à accéder à votre Android Studio => Fichier, Importer un échantillon. Tapez ensuite "Partager le fournisseur d'action".
Vous trouverez ci-dessous le code impliqué dans la création de l'élément de menu Action de partage avec ShareActionProvider avec ActionBarCompat, rétrocompatible avec l'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" />
Suivez les étapes suivantes:
Étape 1) Pour ajouter une action "partager" à votre activité, mettez un ShareActionProvider
dans la ressource de menu de la barre d'application. Comme ça
<item Android:id="@+id/action_share"
Android:title="@string/share"
app:showAsAction="ifRoom"
app:actionProviderClass="Android.support.v7.widget.ShareActionProvider"/>
Veuillez noter le actionProviderClass
Step.2) Maintenant, vous vous assurez que dans votre activité Java classe vous importez même ShareActionProvider
import Android.support.v7.widget.ShareActionProvider;
Étape 3)
Section ci-dessous pour 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());
Méthode d'intention
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;
}