2013-07-22 15 views
7

Nie chcę paska akcji w mojej aplikacji i nadal chcę mieć ten przycisk udostępniania, który jest dostarczany przez pasek akcji.ShareActionProvider bez paska działań w Androidzie

Odbywa się to, gdy znajduje się pasek akcji.

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

Plik menu.xml jest przechowywany w folderze menu.

Gdzie jak chcę przycisk udostępniania w moim xml, gdzie inne układy są również zdefiniowane.

any help?

+2

'ShareActionProvider' nie będzie działać bez' ActionBar'. Ale powinieneś zdobyć kilka pomysłów, patrząc na jego [implementację] (https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/widget/ShareActionProvider.java) – zapl

Odpowiedz

5

Zastosowanie PackageManager i queryIntentActivities() znaleźć aplikacje, które potrafią obsłużyć ACTION_SENDIntent który chcesz wywołać. Wyświetl listę wynikową, jakkolwiek byś chciał. Po dokonaniu wyboru utwórz odpowiednik ACTION_SENDIntent, w którym należy podać wartość ComponentName określonego działania wybranego przez użytkownika i wywołać startActivity().

+0

Czy możesz mi w tym pomóc? Jak w przypadku, gdy nazwy składników nie są wtedy znane? Lub link do dowolnego artykułu będzie pomocny. – user2607444

+0

@ user2607444: "Jak w przypadku, gdy nazwy komponentów nie są wtedy znane?" - Tak, są, jak to było za dwoma pierwszymi zdaniami z mojej odpowiedzi. Na przykład tutaj jest "launcher", który wykonuje podobną operację, ale dla 'ACTION_MAIN' /' CATEGORY_HOME': https://github.com/commonsguy/cw-omnibus/tree/master/Introspection/Launchalot – CommonsWare

1

Użyj intencji z ACTION_SEND. Na przykład po kliknięciu przycisku można:

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

dzięki Andrew: korzystałem z telefonu komórkowego (nie był mój, a także nie był to telefon "wystarczająco inteligentny" :-) do poprawnego napisania kodu) –

7

Nie potrzebujesz paska akcji do udostępniania treści. W rzeczywistości, nawet z paskiem akcji, większość aplikacji nie korzysta z ShareActionProvider, ponieważ projektanci wizualni go nienawidzą i nie obsługuje wielu najnowszych funkcji udostępniania na urządzeniu użytkownika (takich jak bezpośrednie udostępnianie kontaktów). Zamiast tego powinieneś użyć Intent.createChooser, aby stworzyć bardziej rozbudowane okno dialogowe udostępniania.

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

Jeszcze lepszym sposobem na akcję z dowolnego miejsca w aplikacji jest użycie ShareCompat. Oto krótki przykład:

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

Inne przykłady można znaleźć tutaj: https://android.googlesource.com/platform/development/+/master/samples/Support4Demos/src/com/example/android/supportv4/app/SharingSupport.java

Powiązane problemy