2015-01-11 14 views
15

Próbuję zrobić przycisk "Udostępnij" w pasku akcji aplikacji Android. Oto mój kod:Wyjątek: To nie jest obsługiwane, użyj 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; 

i fragment części:

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

Kiedy uruchamiam moją aplikację na emulatorze lub nawet rzeczywistym urządzeniu, otrzymuję wyjątek:

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

i linki do Łańcuchy onCreateOptionsMenu():

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

Co robię źle?

PS: StackTrace błędu z LogCat:

01-11 13: 03:. 17,490 2331-2331/com ***** ***** ***** e../Android Runtime: krytyczny wyjątek: głównym procesowe:. 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

Proszę obejmują StackTrace błędu. – EWit

+0

Dodano Stacktrace! – micsha123

+0

https://classroom.udacity.com/courses/ud853/lessons/1474559101/concepts/14808087260923 Sprawdź na dole tej strony rozdział "Różnica w tej notatce". W szczególności mówi się o "android.support.v7.widget.ShareActionProvider" – Moshii

Odpowiedz

62

Po pierwsze, nie można korzystać z android.widget.ShareActionProviderappcompat-v7 Pasek akcji (np. ActionBarActivity). Użyj wersji appcompat-v7 z lub przenieś wszystko na macierzysty pasek akcji.

Po drugie, jeśli pozostaniesz przy appcompat-v7, to nie możesz bezpiecznie używać getActionProvider(), ponieważ ta metoda nie będzie istnieć na poziomie interfejsu API 10 i poniżej. Wymień menuItem.getActionProvider() na MenuItemCompat.getActionProvider(menuItem).

FWIW, here is a sample project, która implementuje appcompat-v7 wydanie ShareActionProvider.

+0

Tak, masz rację!Brakowało mi informacji z oficjalnej strony dla programistów Androida, która używa android.widget.ShareActionProvider dla API> = 14. Dzięki! – micsha123

+0

Dzięki. Pomogło to – user3734429

+1

Przykładowy projekt jest naprawdę pomocny. Upewnij się, że sprawdzisz plik xml menu - https://github.com/commonsguy/cw-omnibus/blob/master/AppCompat/Share/app/src/main/res/menu/actions.xml - a także kod aktywności - https://github.com/commonsguy/cw-omnibus/blob/master/AppCompat/Share/app/src/main/java/com/commonsware/android/sap/MainActivity.java - ponieważ możesz napotkać nowe problemy w przeciwnym razie. –

10

Możesz śledzić wzór w Kodzie przykład od Google w linku poniżej. https://github.com/googlesamples/android-ActionBarCompat-ShareActionProvider

Najprostszym sposobem jest przejście do Android Studio => Plik, Importuj próbkę. Następnie wpisz "Udostępnij dostawcę akcji".

enter image description here

Poniżej kod zaangażowane w tworzenie Podziel Akcja element menu z ShareActionProvider z ActionBarCompat, wstecznie zgodny z 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" /> 

+1

Bardzo pomocne przy znajdowaniu fragmentu wszystkiego. – aks

+0

To jest świetna pomoc. Miej oko na main_menu.xml, które dla actionProviderClass również używa wersji v7. – Bundeeteddee

Powiązane problemy