2013-10-01 20 views
47

Poniżej znajduje się kod dla mojej działalnościNie można rzutować działania Provider udostępnianie działania Provider

import android.app.Activity; 
    import android.os.Bundle; 
    import android.support.v7.widget.ShareActionProvider; 
    import android.view.Menu; 
    import android.view.MenuItem; 

    public class MainActivity extends Activity { 
    private ShareActionProvider shareAction; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.activity_main, menu); 
     MenuItem item = menu.getItem(R.id.menu_settings); 
     shareAction = (ShareActionProvider) item.getActionProvider(); 
     return true; 
    } 
} 

Problem polega na tym, że nie jest to błąd odlewane z ActionProvider aby go ShareActionProvider.Why jest tak poniżej activity_menu.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" > 

<item 
    android:id="@+id/menu_settings" 
    android:orderInCategory="100" 
    android:showAsAction="always" 
    android:title="@string/menu_settings" 
    android:actionProviderClass="android.widget.ShareActionProvider" 
    /> 

</menu> 

Odpowiedz

176

miałem ten sam problem i znalazłem rozwiązanie:

1) trzeba użyć:

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:bwq="http://schemas.android.com/apk/res-auto" > 

    <item 
     android:id="@+id/menu_share" 
     android:title="@string/menu_share" 
     bwq:actionProviderClass="android.support.v7.widget.ShareActionProvider" 
     bwq:showAsAction="always"/> 
</menu> 

2) oraz w Javie

import android.support.v7.widget.ShareActionProvider; 

i

// Locate MenuItem with ShareActionProvider 
MenuItem item = menu.findItem(R.id.menu_share); 
// Fetch and store ShareActionProvider 
mShareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(item); 
+1

Genialny! MenuItemCompat zrobiło dla mnie sztuczkę – faizal

5

Używasz android.widget.ShareActionProvider, która jest przeznaczona dla natywnego paska akcji API Level 11+. Jeśli korzystasz z backportu AppCompat na pasku akcji, musisz zamiast tego użyć android.support.v7.widget.ShareActionProvider.

+0

Ale błąd jest w obsadzie ActionProvider do ShareActionProvider. I używam android.support.v7.widget.ShareActionProvider –

+1

@AnuranjitMaindola: "I używam android.support.v7.widget.ShareActionProvider" - nie zgodnie z twoim pytaniem. W twoim pytaniu masz 'android: actionProviderClass =" android.widget.ShareActionProvider "'. To ** nie zadziała ** z 'import android.support.v7.widget.ShareActionProvider'. Albo * oba * muszą mieć 'support.v7', albo oba muszą * nie * je mieć. – CommonsWare

1

Problem polegał na tym, że to, co powiedział o @CommonsWare nie używając ShareActionProvider biblioteki wsparcie, a także nawet jeśli zrobiłem to też przyzwyczajenie wypracowaliśmy ponieważ podczas korzystania z biblioteki obsługi wymagamy niestandardowy prefiksy dla niektórych działań jak showAsAction

3

wpadłem na ten problem po android dev actionbar guide, która jest, co robisz w zasadzie. Po przekopaniu się do próbek, które wykorzystują pasek akcji przy użyciu kompatybilnych wstecz bibliotek wsparcia v7 i v4, otrzymałem następujący kod dla onCreateOptionsMenu().

@Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     File file = new File(mFilePath); 


     ShareCompat.IntentBuilder b = ShareCompat.IntentBuilder.from(this) 
     .setType("image/png") 
     .setStream(Uri.fromFile(file)); 


     MenuItem item = menu.add("Share"); 
     ShareCompat.configureMenuItem(item, b); 
     MenuItemCompat.setShowAsAction(item, MenuItemCompat.SHOW_AS_ACTION_IF_ROOM); 
     return true; 
    } 

Kilka rzeczy, na które należy zwrócić uwagę, to fakt, że nie następuje nadmuch z zasobu menu. W menu znajduje się domyślny przycisk udostępniania. Po prostu musisz określić, jaki rodzaj zasobów udostępniasz za pomocą .setType. Ponieważ udostępniam plik, który potrzebuję do setStream, z Uri.fromFile (new File()); Jeśli udostępniasz tekst, ustawisz setType ("text/plain").

Upewnij się również, że zaimportowałeś projekt biblioteki $ SDK \ extras \ android \ support \ v7 \ appcompat, który zawiera potrzebne pakiety. Ponieważ ten projekt biblioteki został zaimportowany, Twój projekt nie potrzebuje pliku v4support.jar w folderze libs, ponieważ projekt biblioteczny już go posiada.

7

menu:

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

Java:

MenuItem menuItem = menu.findItem(R.id.action_share); 
mActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(menuItem);