2013-10-01 11 views
47

Below Teile ist der Code für meine AktivitätUnable Aktion Provider zu werfen Aktion 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; 
    } 
} 

Das Problem ist, dass es ein Gussfehler von ActionProvider es zu ShareActionProvider.Why ist so unter activity_menu.xml ist

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

Antwort

176

ich hatte das gleiche Problem, und ich habe die Lösung gefunden:

1) Sie haben zu verwenden:

<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) und in Java

import android.support.v7.widget.ShareActionProvider; 

und

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

Brilliant! MenuItemCompat hat den Trick für mich gemacht – faizal

5

Sie verwenden android.widget.ShareActionProvider, die für die native API-Level 11+ Aktionsleiste ist. Wenn Sie den AppCompat-Backport der Aktionsleiste verwenden, müssen Sie stattdessen android.support.v7.widget.ShareActionProvider verwenden.

+0

Aber Fehler sind in der Besetzung von ActionProvider zu ShareActionProvider. Und ich benutze android.support.v7.widget.ShareActionProvider –

+1

@AnuranjitMaindola: "Und ich benutze android.support.v7.widget.ShareActionProvider" - nicht nach Ihrer Frage. In Ihrer Frage haben Sie 'android: actionProviderClass =" android.widget.ShareActionProvider "'. Das funktioniert nicht ** mit 'import android.support.v7.widget.ShareActionProvider'. Entweder * beide * müssen 'support.v7' haben, oder beide müssen * nicht * haben. – CommonsWare

1

Das Problem war, dass das, was @CommonsWare sagte über nicht die Unterstützung Bibliothek ShareActionProvider verwenden und auch, wenn ich tat es dann auch gewohnt gearbeitet, weil, wenn Support Library verwenden wir kundenspezifische Präfixe für einige Aktionen erfordern wie showAsAction

3

Ich lief in dieses Problem nach dem android dev actionbar guide die im Grunde ist das, was Sie tun. Nachdem ich die Samples, die die Aktionsleiste mit den abwärtskompatiblen v7- und v4-Support-Bibliotheken verwenden, untersucht habe, habe ich den folgenden Code für onCreateOptionsMenu() verwendet.

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

Ein paar Dinge zu beachten ist, dass Sie nicht aus einer Menü-Ressource aufblasen. Im Menü wird die Standardschaltfläche für die Freigabe hinzugefügt. Sie müssen lediglich angeben, welche Art von Ressource Sie mit .setType teilen. Da ich eine Datei teile, muss ich Stream mit Uri.fromFile (new File()) setzen; Wenn Sie Text freigeben würden, würden Sie Type ("text/plain") setzen.

Stellen Sie außerdem sicher, dass Sie das $ SDK \ extras \ android \ support \ v7 \ appcompat-Bibliotheksprojekt importiert haben, das die benötigten Pakete enthält. Seit dem Import dieses Bibliotheksprojekts benötigt Ihr Projekt nicht mehr die Datei v4support.jar in Ihrem libs-Ordner, da das Bibliotheksprojekt bereits über dieses v4support.jar verfügt.

7

Menü:

<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); 
Verwandte Themen