web-dev-qa-db-fra.com

Exception: ceci n'est pas pris en charge, utilisez MenuItemCompat.getActionProvider ()

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) 
18
micsha123

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.

68
CommonsWare

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

enter image description here

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" />
11

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;
    }
1
Om Prakash Sao