2015-01-11 8 views
15

Androidアプリケーションのアクションバーに「共有」ボタンを作成しようとしています。 ここに私のコード:例外:これはサポートされていません。MenuItemCompat.getActionProvider()を使用してください

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からのエラーのスタックトレース:

1月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) 
+0

エラーのスタックトレースを含めてください。 – EWit

+0

Stacktraceが追加されました! – micsha123

+0

https://classroom.udacity.com/courses/ud853/lessons/1474559101/concepts/14808087260923 このページの下にある「このメモの差分」セクションを確認してください。具体的には、 "android.support.v7.widget.ShareActionProvider"を使用すると言います。 – Moshii

答えて

62

まず、あなたがandroid.widget.ShareActionProviderを使用することはできませんappcompat-v7アクションバーバックポート(例:ActionBarActivity)。 appcompat-v7バージョンのShareActionProviderを使用するか、すべてをネイティブアクションバーに移動します。

第2に、appcompat-v7を使用すると、getActionProvider()は安全に使用できません。その方法はAPIレベル10以下には存在しません。 menuItem.getActionProvider()MenuItemCompat.getActionProvider(menuItem)に置き換えてください。

appcompat-v7ShareActionProviderを実装しているFWIW、here is a sample project

+0

はい、そうです!私は公式のAndroidデベロッパーサイトから、API> = 14のためにandroid.widget.ShareActionProviderを使用した情報を見逃しました。ありがとう! – micsha123

+0

ありがとうございます。これで助けられました – user3734429

+1

サンプルプロジェクトは本当に役に立ちます。メニューXMLファイル(https://github.com/commonsguy/cw-omnibus/blob/master/AppCompat/Share/app/src/main/res/menu/actions.xml)をチェックしてください。アクティビティコード - https://github.com/commonsguy/cw-omnibus/blob/master/AppCompat/Share/app/src/main/java/com/commonsware/android/sap/MainActivity.java - あなたが遭遇する可能性があるためそうでなければ新しい問題。 –

10

Googleのコードサンプルのパターンは、以下のリンクで確認できます。 https://github.com/googlesamples/android-ActionBarCompat-ShareActionProvider

最も簡単な方法は、Android Studio =>ファイル、インポートサンプルに移動することです。次に、「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" /> 

+1

すべてのスニペットを見つけるのに非常に役立ちます。 – aks

+0

これは大きな助けです。 main_menu.xmlには、actionProviderClassのサポートv7バージョンも使用しています。 – Bundeeteddee

関連する問題