web-dev-qa-db-ja.com

例外:これはサポートされていません。MenuItemCompat.getActionProvider()を使用してください

Androidアプリケーションのアクションバーに「共有」ボタンを作成しようとしています。ここに私のコード:

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;

そしてフラグメント部分:

{
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;
}

エミュレーターまたは実際のデバイスでアプリを実行すると、例外が発生します。

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

そして、onCreateOptionsMenu()の文字列にリンクします。

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

私は何を間違っていますか?

PS:logcatからのエラーのスタックトレース:

01-11 13:03:17.490 2331-2331/com。*****。*****。***** E/AndroidRuntime:致命的な例外:メインプロセス: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

まず、_Android.widget.ShareActionProvider_を_appcompat-v7_アクションバーのバックポート(ActionBarActivityなど)と共に使用することはできません。 _appcompat-v7_バージョンのShareActionProviderを使用するか、すべてをネイティブアクションバーに移動します。

次に、_appcompat-v7_をそのまま使用すると、getActionProvider()を安全に使用できなくなります。そのメソッドはAPIレベル10以下では存在しないためです。 menuItem.getActionProvider()MenuItemCompat.getActionProvider(menuItem)に置き換えます。

FWIW、 これはサンプルプロジェクトです は、ShareActionProviderの_appcompat-v7_エディションを実装しています。

68
CommonsWare

以下のリンクにあるGoogleのコードサンプルのパターンに従ってください。 https://github.com/googlesamples/Android-ActionBarCompat-ShareActionProvider

最も簡単な方法は、Android Studio => File、Import Sample)に移動して、「Share Action Provider」と入力することです。

enter image description here

以下は、API v7と下位互換性のある、ActionBarCompatを使用したShareActionProviderを使用した共有アクションメニュー項目の作成に関連するコードです。

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

次の手順に従ってください。

Step.1)アクティビティに「共有」アクションを追加するには、アプリバーのメニューリソースにShareActionProviderを配置します。このような

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

actionProviderClassに注意してください

Step.2)これで、アクティビティでJavaインポートするクラスが同じであることを確認してくださいShareActionProvider

import Android.support.v7.widget.ShareActionProvider;

Step.3)
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());

意図的方法

    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