2013-07-22 20 views
7

Non voglio una barra delle azioni nella mia app e voglio ancora avere quel pulsante di condivisione che viene fornito dalla barra delle azioni.ShareActionProvider senza barra delle azioni in Android

Questo viene eseguito quando la barra delle azioni è presente.

public boolean onCreateOptionsMenu(Menu menu) { 

    getMenuInflater().inflate(R.menu.main, menu); 
    ShareActionProvider provider = (ShareActionProvider) 
    menu.findItem(R.id.menu_share).getActionProvider(); 

    if (provider != null) { 
     Intent shareIntent = new Intent(); 
     shareIntent.setAction(Intent.ACTION_SEND); 
     shareIntent.putExtra(Intent.EXTRA_TEXT, "hi"); 
     shareIntent.setType("text/plain"); 
     provider.setShareIntent(shareIntent); 
    } 

    return true; 
} 

E il menu.xml viene mantenuto nella cartella del menu.

Dove voglio un pulsante di condivisione nel mio XML in cui sono definiti anche altri layout.

aiuto?

+2

'ShareActionProvider' non funziona senza' ActionBar'. Ma dovresti ottenere alcune idee osservando la sua [implementazione] (https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/widget/ShareActionProvider.java) – zapl

risposta

5

Usa PackageManager e queryIntentActivities() per trovare le applicazioni che sanno come gestire la ACTION_SENDIntent che si desidera richiamare. Mostra l'elenco risultante come preferisci. Quando l'utente effettua una selezione, crea un equivalente ACTION_SENDIntent, dove si specifica il ComponentName della particolare attività scelta dall'utente e si chiama startActivity().

+0

Puoi aiutarmi di più con questo? Come se i nomi dei componenti non fossero noti allora? Oppure il link a qualsiasi articolo sarà utile. – user2607444

+0

@ user2607444: "Come se i nomi dei componenti non fossero noti allora?" - sì, lo sono, poiché quello era il punto dietro le prime due frasi della mia risposta. Ad esempio, ecco un "launcher" che esegue un'operazione simile, ma per 'ACTION_MAIN' /' CATEGORY_HOME': https://github.com/commonsguy/cw-omnibus/tree/master/Introspection/Launchalot – CommonsWare

1

Utilizzare un intento con ACTION_SEND. Ad esempio, quando un tasto è scattato si potrebbe:

Intent It = new Intent(Intent.ACTION_SEND); 
It.setType("text/plain"); 
It.putExtra(android.content.Intent.EXTRA_TEXT,"your_text_to_share"); 
YourActivity.this.startActivity(It); 
+0

grazie Andrew: stavo usando un telefono cellulare (non era mio e anche non era un telefono "abbastanza intelligente" :-) per scrivere correttamente il codice) –

7

Non è necessario una barra delle operazioni per condividere contenuti. Infatti, anche con una barra delle azioni, la maggior parte delle app non usa lo ShareActionProvider perché i designer visivamente lo odiano e non supporta molte delle funzionalità di condivisione più recenti su un dispositivo degli utenti (come la condivisione diretta ai contatti). Invece dovresti usare Intent.createChooser per creare una finestra di dialogo condivisa più robusta.

Intent sendIntent = new Intent(); 
sendIntent.setAction(Intent.ACTION_SEND); 
sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send."); 
sendIntent.setType("text/plain"); 
startActivity(Intent.createChooser(sendIntent, getResources().getText(R.string.send_to))); 

http://developer.android.com/training/sharing/send.html

Un ancora migliore modo per condividere da qualsiasi punto della app è quello di utilizzare ShareCompat. Ecco un esempio veloce:

ShareCompat.IntentBuilder.from(this) 
      .setType("text/plain") 
      .setText("I'm sharing!") 
      .startChooser(); 

Altri esempi si possono trovare qui: https://android.googlesource.com/platform/development/+/master/samples/Support4Demos/src/com/example/android/supportv4/app/SharingSupport.java

Problemi correlati