In dieser Lektion werden wir eine weitere sehr nützliche Funktion des Android Intent Systems kennenlernen. Wir werden für unsere App einen ShareActionProvider implementieren, mit dem bequem und intuitiv Inhalte geteilt werden können.
Das Teilen der Inhalte wird über die App Bar der DetailActivity erfolgen. Dabei werden dem ShareActionProvider Informationen über das angezeigte Zitat übermittelt, so dass dieser die übergebenen Daten selbständig verteilen kann.
Wie die entsprechenden Daten an den ShareActionProvider übermittelt werden und wie der ShareActionProvider für unsere Android App aktiviert wird, werden wir im theoretischen Teil dieser Lektion ausführlich beschreiben. Dabei werden wir auch erfahren, wie der ShareActionProvider per XML einem bestimmten Menüeintrag zugewiesen werden kann.
Anschließend werden wir im praktischen Teil dieser Lektion einen ShareActionProvider für die DetailActivity unserer Android App aktivieren. Dazu werden wir einen neuen Menüeintrag in das Options Menu der DetailActivity einfügen, mit dessen Hilfe der ShareActionProvider definiert wird. Der neue Menüeintrag wird dem Overflow Menu der App Bar zugewiesen werden.
Danach werden wir dem ShareActionProvider die zu teilenden Inhalte übergeben. Dies wird in der DetailActivity-Klasse mit Hilfe eines impliziten Intents erfolgen, den wir für den ShareActionProvider registrieren werden. Dieser impliziten Intent wird die zu teilenden Inhalte, den Zitattext und Zitatautor, in sich tragen und vom ShareActionProvider automatisch versendet werden, sobald der entsprechende Menüeintrag im Options Menu angeklickt wurde.
Abschließend werden wir unsere Android App im Emulator auf einem Android Virtual Device ausführen und prüfen, ob der ShareActionProvider die ihm per impliziten Intent übergebenen Inhalte korrekt mit anderen Android Apps teilt.
1. Der ActionProvider und ShareActionProvider von Android
In Android wurden ActionProvider mit API Level 14 (Android 4.0) eingeführt. Sie ermöglichen eine bessere Interaktion mit Menükomponenten und sind verantwortlich für das Erzeugen von Action-Views, die direkt in der Action Bar eingebunden sind. Zudem können sie dynamisch Untermenüs zu bestehenden Menüeinträgen erstellen.
Meist wird ein ActionProvider an einen Menüeintrag der Action Bar gebunden, dann übernimmt er sowohl das Aussehen, als auch das Verhalten dieses Elements. Der Provider erzeugt für den Menüeintrag einen Action-View, der in der Action Bar anstelle eines einfachen Action-Buttons erscheint.
Es ist auch möglich den Menüeintrag im Overflow Menu anzuzeigen, dann wird kein Action-View vom ActionProvider erzeugt, sondern nur die für den Menüeintrag hinterlegte Aktion von ihm ausgeführt.
Ein ActionProvider kann auf zwei Arten mit einem Menüeintrag verbunden werden:
-
Per Quellcode – Binden des ActionProviders direkt an einen Menüeintrag. Dazu muss zuerst eine Referenz auf die Instanz des entsprechenden Menüeintrags (MenuItem) angefordert werden und anschließend auf dem MenuItem-Objekt die setActionProvider() Methode aufgerufen werden. Mit Hilfe der setActionProvider() Methode kann dann der ActionProvider mit dem Menüeintrag verbunden werden.
-
Per XML – Deklarieren des ActionProviders in einer XML-Menü Ressourcen Datei. Dazu muss dem Menüeintrag der zu verwendende ActionProvider per XML zugewiesen werden. Dies geschieht mit Hilfe des Attributs android:actionProviderClass in der XML-Menü Ressourcen Datei. Der so deklarierte ActionProvider ist dann automatisch mit dem Menüeintrag zur Laufzeit verbunden.
Wurde ein ActionProvider wie oben beschrieben mit einem Menüeintrag verbunden, muss ihm nur noch ein expliziter Intent zur Verfügung gestellt werden, der spezifiziert, welche Aktion vom Provider ausgeführt werden soll. Wie dies erfolgt, werden wir nun am Beispiel des ShareActionProvider ausführlich beschreiben.
1.1 Was ist ein ShareActionProvider?
Ein besonderer ActionProvider ist der ShareActionProvider. Wie der Name schon erahnen lässt, ist er von der Basisklasse ActionProvider abgeleitet und für das Teilen von Inhalten (share action) zuständig.
Der ShareActionProvider erstellt selbständig Views, die das Teilen von Inhalten mit anderen Apps ermöglichen. Außerdem kann er ein Untermenü generieren, in welchem alle verfügbaren Sharing Activities aufgelistet sind. Ein solches Untermenü wird immer dann vom ShareActionProvider erstellt, wenn sich der ihm zugewiesene Menüeintrag im Overflow Menu der App Bar befindet.
Mit einem ShareActionProvider können andere Apps genutzt werden, um Texte, Photos, Videos und Links komfortabel zu teilen. Welche Sharing-Apps auf den Android Geräten der Benutzer installiert sind, muss dabei nicht bekannt sein. Dem ShareActionProvider muss nur mitgeteilt werden, welche Daten von ihm mit anderen Apps geteilt werden sollen.
Sobald man dem ShareActionProvider dies mitgeteilt hat, übernimmt er den Rest. Er erstellt selbständig eine Übersicht der zur Verfügung stehenden Sharing-Apps und zeigt diese den Nutzern an. Die angezeigten Apps müssen uns nicht bekannt sein. Sie können sogar erst nach unserer eigenen App entwickelt worden sein und sie werden dennoch vom ShareActionProvider den Benutzern zur Auswahl angeboten.
1.2 Implementieren eines ShareActionProviders in Android
Um einen ShareActionProvider in die eigene App einzubinden, sind folgende Schritte auszuführen:
-
Definieren eines Share-Menüeintrags – Der ShareActionProviders wird meist an einen Menüeintrag gekoppelt. Damit dies möglich ist, muss vorher ein Share-Menüeintrag in der entsprechenden XML-Menü Ressourcen Datei definiert und diesem der ShareActionProvider zugewiesen werden.
-
Bereitstellen des Share-Intents – Damit der mit einem Menüeintrag verknüpfte ShareActionProviders auch Inhalte mit anderen Apps teilen kann, müssen ihm die zu teilenden Daten exakt beschrieben werden. Dies geschieht mit Hilfe eines impliziten Intents, dem sog. Share-Intent, der eine exakte Beschreibung der zu teilenden Daten enthält und dem ShareActionProvider mit Hilfe der setShareIntent() Methode zur Verfügung gestellt wird.
Wir werden nun die beiden Schritte beispielhaft durchführen.
1.2.1 Definieren eines Share-Menüeintrags in einer XML-Menü Datei
Um einen Share-Menüeintrag zu definieren, muss zunächst ein ganz normaler Menüeintrag in der entsprechenden XML-Menü Ressourcen Datei angelegt werden. Anschließend wird diesem Menüeintrag mit Hilfe des Attributs android:actionProviderClass der ShareActionProvider zugewiesen.
Mit folgendem XML-Code wird auf diese Weise ein Share-Menüeintrag definiert:
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <!-- Der Share-Menüeintrag soll immer im Overflow-Menü angezeigt werden --> <item android:id="@+id/action_share_quote" android:title="Zitat teilen" app:actionProviderClass="androidx.appcompat.widget.ShareActionProvider" app:showAsAction="never" /> </menu>
In Zeile 9 wird der ShareActionProvider dem Menüeintrag zugewiesen. Dazu wird über das Attribut android:actionProviderClass die zu verwendende ShareActionProvider-Klasse festgelegt. Dadurch wird die Verantwortung für das Aussehen und das Verhalten des Menüeintrags an ShareActionProvider übergeben.
Da in unserer Android App die App Bar mit Hilfe der AndroidX Library implementiert ist, müssen wir als ShareActionProvider-Klasse auch die der AndroidX Library verwenden. Daraus ergibt sich zudem der Vorteil, dass wir den ShareActionProvider auch für Android Versionen vor Version 4.0 (API Level 14) einsetzen könnten.
In Zeile 10 wird mit dem Attribut showAsAction festgelegt, dass der Share-Menüeintrag niemals als Aktion in der Action Bar angezeigt wird, sondern stets dem Overflow Menu zugeordnet wird. Der ShareActionProvider wird aus diesem Grund kein Action-View erstellen, sondern ein Untermenü innerhalb des Overflow Menu. Daher musste auch unbedingt ein Titel für den Menüeintrag festgelegt werden.
Der Share-Menüeintrag ist somit vollständig definiert. Der zugewiesene ShareActionProvider steuert nun das Aussehen des Menüeintrags, er ist jedoch noch nicht in der Lage Daten mit anderen Apps zu teilen, da ihm noch nicht bekannt ist, welche Daten geteilt werden sollen.
1.2.2 Bereitstellen des Share-Intents für den ShareActionProvider
Um den ShareActionProvider mitzuteilen, welche Daten durch ihn mit anderen Apps geteilt werden sollen, muss ihm ein impliziter Intent zur Verfügung gestellt werden. Dieser Intent muss exakt vorgeben, welche Art von Daten geteilt werden sollen. Außerdem muss er die zu teilenden Daten enthalten.
Das Erzeugen des impliziten Intents und Übergeben des Intents an den ShareActionProvider sollte in der onCreateOptionsMenu() Methode der Activity erfolgen. Diese Methode wird vom Android System aufgerufen, wenn das Options Menu der Activity erzeugt wird.
Mit folgendem Quellcode wird ein Share-Intent für den ShareActionProvider bereitgestellt:
public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_activity_detail, menu); // 1. Über den Share-Menüeintrag die ShareActionProvider-Instanz anfordern MenuItem shareMenuItem = menu.findItem(R.id.action_share_quote); ShareActionProvider shareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(shareMenuItem); // 2. Erzeugen des impliziten SEND-Intents Intent shareIntent = new Intent(Intent.ACTION_SEND); shareIntent.setType("text/plain"); shareIntent.putExtra(Intent.EXTRA_TEXT, "Dieser Text wird geteilt."); // 3. Der erzeugte Intent wird als ShareIntent des ShareActionProviders festgelegt if (shareActionProvider != null) { shareActionProvider.setShareIntent(shareIntent); } return true; }
Die onCreateOptionsMenu() Methode wird automatisch vom Android System beim Erzeugen der Activity aufgerufen. Sie wird zum Erstellen des Options Menus verwendet. Dabei werden die im Options Menu definierten Menüeinträge automatisch auch als Aktionen für die App Bar registriert.
Das Options Menu wird in Zeile 2 erstellt. Dabei werden die Menüelemente der übergebenen XML-Menü Ressourcen-Datei menu_activity_detail.xml
als MenuItem-Objekte instanziiert. Dies geschieht über die inflate() Methode des MenuInflater-Objekts, welches mit Aufruf der getMenuInflater() Methode angefordert wird.
Das Bereitstellen des Share-Intents für den ShareActionProvider verläuft dann in 3 Schritten:
-
Anfordern der ShareActionProvider-Instanz – Eine Referenz auf das ShareActionProvider-Objekt kann über den Share-Menüeintrag angefordert werden. Dazu wird der getActionProvider() Methode das korrespondierenden MenuItem-Objekt übergeben. Als Rückgabewert erhalten wir eine Referenz auf die ShareActionProvider-Instanz. Das dafür benötigte MenuItem-Objekt wird vorher mit Hilfe der findItem() Methode und der entsprechenden Menü Ressourcen-ID
R.id.action_share_quote
angefordert. -
Erzeugen des impliziten Share-Intents – Dem ShareActionProvider muss exakt vorgegeben werden, welche Daten mit anderen Apps geteilt werden sollen. Dies erfolgt über einen Share-Intent, für den als seine Aktion Intent.ACTION_SEND und als sein MIME type text/plain (einfacher Text) vorgegeben wird. Außerdem wird dem Intent der zu teilenden Inhalt per putExtra() Methode übergeben.
-
Übergeben des Intents an den ShareActionProvider – Der erzeugte implizite Intent muss nun noch dem ShareActionProvider zur Verfügung gestellt werden. Dies geschieht mit Hilfe der setShareIntent() Methode, die auf der ShareActionProvider-Instanz aufgerufen wird und als Argument den Share-Intent erhält. Bei diesem Schritt muss zwingend überprüft werden, ob das ShareActionProvider-Objekt auch vorhanden ist.
Damit das Options Menu auch angezeigt und für die App Bar verwendet wird, muss beim Verlassen der onCreateOptionsMenu() Methode als Rückgabewert true zurückgegeben werden. Dies geschieht in Zeile 19. Würde man den Wert false zurückgeben, würde das Menü nicht angezeigt und auch nicht für die App Bar verwendet werden.
Nachdem der Share-Menüeintrag wie oben beschrieben definiert und ein Share-Intent für den ShareActionProvider bereitgestellt wurde, ist die Implementierung des ShareActionProvider abgeschlossen. Mit seiner Hilfe können nun Inhalte mit anderen Android Apps geteilt werden.
2. Definieren eines Share-Menüeintrags für den ShareActionProvider
Wir werden nun im praktischen Teil dieser Lektion einen ShareActionProvider in unsere eigene Anwendung integrieren. Er wird für das Teilen des von der DetailActivity angezeigten Zitats verantwortlich sein und über einen Menüeintrag der App Bar aktiviert werden.
Um den ShareActionProvider zu integrieren, werden wir zunächst einen Share-Menüeintrag in der XML-Menü Ressourcen Datei der DetailActivity definieren. Danach werden wir in der DetailActivity-Klasse einen Share-Intent für den ShareActionProvider zur Verfügung stellen.
Beginnen werden wir nun mit dem Definieren des Share-Menüeintrags. Dazu öffnen wir die XML-Menüdatei menu_activity_detail.xml
im Editorfenster von Android Studio, indem wir doppelt auf ihren Dateinamen im Project Tool Window klicken. Die Datei befindet sich im res/menu/ Ordner unseres Projekts.
Standardmäßig öffnet sich nun das Editorfenster in der Design-Ansicht. Damit der XML-Code angezeigt wird, müssen wir unten im Editorfenster den Tab Text anklicken.
Dem XML-Code der menu_activity_detail.xml
Datei fügen wir nun die markierten Zeilen hinzu:
menu_activity_detail.xml
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <!-- "Lookup Author", soll immer im Overflow-Menü angezeigt werden --> <item android:id="@+id/action_lookup_author" android:orderInCategory="1" android:title="@string/action_lookup_author" app:showAsAction="never" /> <!-- "Settings", soll immer im Overflow-Menü angezeigt werden --> <item android:id="@+id/action_settings" android:orderInCategory="9" android:title="@string/action_settings" app:showAsAction="never" /> <!-- "Share Quote", soll immer im Overflow-Menü angezeigt werden --> <item android:id="@+id/action_share_quote" android:orderInCategory="2" android:title="@string/action_share_quote" app:actionProviderClass="androidx.appcompat.widget.ShareActionProvider" app:showAsAction="never" /> </menu>
Mit dem oberen XML-Code haben wir eine Android Menu Resource definiert, die zur Laufzeit von einem MenuInflater zu einem Menu-Objekt umgewandelt wird, welches wir für das Erzeugen des Options Menus unserer DetailActivity verwenden werden. Da in Android das Options Menu automatisch auch als das App Bar-Menü verwendet wird, werden auf diese Weise die Aktionen der App Bar nach den Vorgaben dieser Menu Resource definiert.
Eine Menu Resource besitzt immer genau ein <menu> Wurzelelement, welches im Inneren <item> und <group> Elemente enthält. In unserem Fall besitzt das <menu> Element nun drei <item> Tochterelemente, welche die drei Einträge des Menüs repräsentieren. Jedem <item> Element wurde eine eigene ID zugewiesen, über die wir später auf das korrespondierende MenuItem-Objekt zur Laufzeit zugreifen können.
Der Share-Menüeintrag ist neu hinzugefügt worden und wird mit den Zeilen 19 bis 25 definiert. Als ID wurde ihm action_share_quote zugewiesen. Durch das @ Symbol weiß der XML-Parser, dass es sich um eine ID-Ressource handelt. Das + Symbol gibt an, dass die ID-Ressource in der R.java
Datei neu angelegt werden muss.
Zusätzlich wurden für den Share-Menüeintrag weitere Eigenschaften mit folgenden Attributen definiert:
-
android:orderInCategory – Gibt die Reihenfolge der Menüeinträge an, je niedriger die Zahl desto weiter oben wird der jeweilige Eintrag im Menü angeordnet. Da in Android auch Menüs miteinander verschmolzen werden können, lassen sich auf diese Weise die Menüeinträge effektiv ordnen.
-
android:title – Legt den Titel des Menüeintrags fest. Der Eintrag wird unter diesem Titel im Overflow Menu der App Bar angezeigt. Wenn der Menüeintrag als Action-Button in der App Bar erscheint, wird nur der entsprechende Icon dargestellt, nicht aber der Titel.
-
app:actionProviderClass – Gibt an welcher ActionProvider anstelle des Action-Elements verwendet werden soll. Dadurch wird der Menüeintrag an einen ActionProvider gebunden. Der ActionProvider muss mit vollqualifizierendem Klassennamen benannt werden.
-
app:showAsAction – Mit diesem Attribut wird vorgegeben, ob der Menüeintrag als Action-Button in der App Bar oder als Text im Overflow Menu der App Bar erscheinen soll. Als Vorgaben stehen ifRoom, withText, never und always zur Auswahl bereit.
In Android Studio sollte die überarbeitet menu_activity_detail.xml
Datei nun wie folgt aussehen:
Wir haben nun den Share-Menüeintrag in die XML-Menü Ressourcen Datei menu_activity_detail.xml
definiert (Markierung A) und dadurch den ShareActionProvider für unsere Android App aktiviert.
Als Nächstes muss dem ShareActionProvider mitgeteilt werden, welche Daten durch ihn mit anderen Anwendungen geteilt werden sollen. Dies wird mit Hilfe eines impliziten Intents erfolgen, den wir dem ShareActionProvider in der DetailActivity-Klasse bereitstellen werden.
3. Den Share-Intent für den ShareActionProvider bereitstellen
Um den ShareActionProvider mitzuteilen, welche Daten durch ihn mit anderen Apps geteilt werden sollen, muss ihm ein impliziter Intent zur Verfügung gestellt werden. Dieser Intent muss exakt vorgeben, welche Art von Daten geteilt werden sollen. Außerdem muss er die zu teilenden Daten enthalten.
Das Erzeugen des impliziten Intents und Übergeben des Intents an den ShareActionProvider muss in unserem Fall in der onCreateOptionsMenu() Methode der DetailActivity-Klasse erfolgen. Diese Methode wird vom Android System automatisch aufgerufen, sobald das Options Menu der DetailActivity erzeugt wird.
Wir öffnen nun die Klassendatei DetailActivity.java
im Editor von Android Studio mit einem Doppelklick auf ihren Dateinamen im Project Tool Window. Die Klassendatei befindet sich im Package-Ordner de.codeyourapp.zitate unseres Projekts.
Alle in die DetailActivity.java
Datei eingefügten Codezeilen sind markiert worden. Es wurde nur der Quellcode der onCreateOptionsMenu() Methode überarbeitet und zwei Import-Anweisungen hinzugefügt:
An dieser Stelle endet der freie Inhalt dieser Lektion. Wir hoffen, sie hat dir bis hierher gefallen! Du kannst sie im geschützten Bereich von ProgrammierenLernenHQ fortsetzen, in welchem sich alle Lektionen unserer Android Online-Kurse befinden.
Unsere Android Kurse bestehen aus insgesamt 43 großen Lektionen und sind unterteilt in 13 frei zugängliche und 30 Premium-Lektionen. Die Premium-Lektionen befinden sich in dem geschützten Bereich und sind nur für Käufer unseres Android Online-Kurs Gesamtpaket zugänglich.
In unserem Android Online-Kurs Gesamtpaket befinden sich 43 große Lektionen, in denen wir dir schrittweise zeigen, wie voll funktionstüchtige Android Apps programmiert werden.
Diese Lektion ist Teil unseres Android Gesamtpakets. Insgesamt sind unsere Online-Kurse unterteilt in 13 frei zugängliche und 30 Premium-Lektionen.
Die Premium-Lektionen befinden sich in dem geschützten Bereich und sind nur für Käufer des Android Online-Kurs Gesamtpakets zugänglich.
Welche Inhalte befinden sich im Android Online-Kurs Gesamtpaket?
Wir hoffen, Dich bald als neuen Kursteilnehmer unserer Android Online-Kurse begrüßen zu dürfen!
Einmal kaufen und dadurch zeitlich unbegrenzten Zugriff auf alle Inhalte unseres Android Online-Kurs Gesamtpakets erhalten.
Hinweis: Der untere Quellcode ist Teil des geschützten Bereichs von ProgrammierenLernenHQ. Durch Freischalten unserer Android Online-Kurse erhältst du Zugriff auf alle geschützten Inhalte.
Erfahre mehr über unsere Android Online-Kurse.
In dem oben aufgeführten Quellcode der DetailActivity.java
Datei wurde die Methode onCreateOptionsMenu() bereits überarbeitet. Zudem wurden zwei externe Klassen per Import-Anweisung sichtbar gemacht. Weitere Änderungen sind nicht an der DetailActivity-Klasse vorgenommen worden.
In den Zeile 3 und 4 werden die Klassen MenuItemCompat und ShareActionProvider mittels Import-Anweisungen innerhalb der DetailActivity-Klasse sichtbar gemacht, so dass wir sie ohne den Namen ihres Packages verwenden können.
Die überarbeitete Methode onCreateOptionsMenu() in den Zeilen 60 bis 93 wurde ebenfalls markiert. In ihr wurde der Quellcode für das Bereitstellen des impliziten Intent für den ShareActionProvider eingefügt. Dabei wurde der bisherige Quellcode der Methode überschrieben. Um Programmierfehler zu vermeiden, ist es sicherer, die Methode daher vollständig durch den oben markierten Quellcode zu ersetzten.
Die onCreateOptionsMenu() Methode
Wie bereits weiter oben erwähnt, wird in den Zeilen 60 bis 93 der DetailActivity-Klasse die onCreateOptionsMenu() Methode definiert. Sie wird vom Android System automatisch aufgerufen, sobald das Options Menu der DetailActivity erstellt wird.
In ihr werden wir den Share-Intent für den ShareActionProvider bereitstellen. Wie dies erfolgt, werden wir nun genauer betrachten. Die Methode ist daher zur Übersichtlichkeit an dieser Stelle nochmals aufgeführt:
public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_activity_detail, menu); Intent receivedIntent = getIntent(); if (receivedIntent != null && receivedIntent.hasExtra(EXTRA_QUOTE_AUTHOR)) { // Erstellen der Share-Nachricht aus den Daten des empfangenen Intents String quoteAuthor = receivedIntent.getStringExtra(EXTRA_QUOTE_AUTHOR); String quoteText = receivedIntent.getStringExtra(EXTRA_QUOTE_TEXT); String shareMessage = "\"" + quoteText + "\"\n\n" + quoteAuthor; // 1. Über den Share_Quote-Menüeintrag die ShareActionProvider-Instanz anfordern MenuItem shareMenuItem = menu.findItem(R.id.action_share_quote); ShareActionProvider shareActionProvider; shareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(shareMenuItem); // 2. Erzeugen des impliziten SEND-Intents mit den Zitatdaten als Betreff und Text Intent shareIntent = new Intent(Intent.ACTION_SEND); shareIntent.setType("text/plain"); shareIntent.putExtra(Intent.EXTRA_SUBJECT, "Ein schönes Zitat"); shareIntent.putExtra(Intent.EXTRA_TEXT, shareMessage); // 3. Das Intent-Objekt wird als ShareIntent des ShareActionProviders festgelegt if (shareActionProvider != null) { shareActionProvider.setShareIntent(shareIntent); } else { Toast toast = Toast.makeText(getApplicationContext(), "Kein ShareActionProvider vorhanden!", Toast.LENGTH_LONG); toast.show(); } } return true; }
Zu Beginn der onCreateOptionsMenu() Methode wird in Zeile 2 ein MenuInflater-Objekt angefragt. Auf diesem Objekt wird die inflate() Methode aufgerufen und ihr die Ressourcen-ID der im vorherigen Abschnitt erweiterten Menu Resource übergeben.
Auf diese Weise wird das Options Menu basierend auf der übergebenen Menu Resource erzeugt. Dabei wird automatisch der ShareActionProvider für die App Bar aktiviert, da die Elemente des Options Menu auch als App Bar-Aktionen verwendet werden.
Anschließend wird in Zeile 4 das empfangene Intent-Objekt angefragt. Dabei handelt es sich um den Intent durch den die DetailActivity-Klasse gestartet wurde. Also um den expliziten Intent, welchen wir in einer vorherigen Lektion implementiert haben. Dieser enthält in seinem Extras-Feld Informationen über den Autor, das Autorenbild und den Zitattext.
Der anschließende if-Block wird nur betreten, falls ein empfangenes Intent-Objekt existiert und es Informationen über den Zitat-Autor in sich trägt. Ob solche Informationen im Intent vorhanden sind, wird mit der Methode hasExtra() und dem Schlüssel EXTRA_QUOTE_AUTHOR, dem der Autorenname hinterlegt ist, überprüft.
In den Zeilen 8 bis 10 wird die Share-Nachricht erstellt. Dazu wird mit der Methode getStringExtra() der unter dem Schlüssel EXTRA_QUOTE_AUTHOR hinterlegte Autorenname und der unter EXTRA_QUOTE_TEXT hinterlegte Zitattext ausgelesen.
Danach wird der Share-Intent für den ShareActionProvider mit den folgenden 3 Schritten bereitgestellt:
-
Anfordern der ShareActionProvider-Instanz – Eine Referenz auf das ShareActionProvider-Objekt wird über den Share-Menüeintrag angefordert. Dazu wird der getActionProvider() Methode das korrespondierenden MenuItem-Objekt übergeben. Als Rückgabewert erhalten wir eine Referenz auf die ShareActionProvider-Instanz. Das dafür benötigte MenuItem-Objekt wird vorher mit Hilfe der findItem() Methode und der entsprechenden Menü Ressourcen-ID
R.id.action_share_quote
angefordert. -
Erzeugen des impliziten Share-Intents – Dem ShareActionProvider wird nun exakt vorgegeben, welche Daten geteilt werden sollen. Dies erfolgt über einen Share-Intent, für den als seine Aktion Intent.ACTION_SEND und als sein MIME type text/plain (einfacher Text) vorgegeben wird.
Außerdem wird dem Intent der zu teilenden Inhalt per putExtra() Methode übergeben. Dazu werden als Schlüssel die von der Intent-Klasse definierten Konstanten EXTRA_SUBJECT und EXTRA_TEXT verwenden, mit deren Hilfe der Betreff bzw. die Share-Nachricht im Intent.Objekt abgelegt wird.
-
Übergeben des Intents an den ShareActionProvider – Der erzeugte implizite Intent wird anschließend dem ShareActionProvider zur Verfügung gestellt werden. Dies geschieht mit Hilfe der setShareIntent() Methode, die auf der ShareActionProvider-Instanz aufgerufen wird und der als Argument die Instanz des vorher erzeugen Share-Intents übergeben wird.
Dieser Schritt wird aber nur ausgeführt, wenn das ShareActionProvider-Objekt auch vorhanden ist. Falls kein solches Objekt existiert, wird der Nutzer mittels einer kurzen Toast-Meldung über das Fehlen des ShareActionProviders informiert.
Damit das Options Menu auch angezeigt und für die App Bar verwendet wird, muss beim Verlassen der onCreateOptionsMenu() Methode als Rückgabewert true zurückgegeben werden. Dies geschieht in Zeile 33. Würde man den Wert false zurückgeben, würde das Menü nicht angezeigt und auch nicht für die App Bar verwendet werden.
In Android Studio sollte der Inhalt der DetailActivity.java
Klassendatei nun wie folgt aussehen:
In der oberen Abbildung ist die überarbeitete DetailActivity.java
Klassendatei dargestellt. Der Quellcode wurde diesmal an zwei Stellen verändert. Es ist nur die onCreateOptionsMenu() Methode aufgeklappt worden, da sie als einzige in dieser Lektion überarbeitet wurde.
Welche Bedeutung der jeweilige Code-Block besitzt, ist in der unteren Liste angegeben:
- B – Die benötigten Import-Anweisungen zum Sichtbarmachen der Klassen MenuItemCompat und ShareActionProvider.
- C – Die onCreateOptionsMenu() Methode, in der ein impliziter Intent für den ShareActionProvider bereitgestellt wird.
Wir haben nun alle erforderlichen Änderungen an der DetailActivity-Klasse vorgenommen. Von der überarbeiteten onCreateOptionsMenu() Methode lassen wir nun einen Share-Intent erzeugen und registrieren ihn für den ShareActionProvider.
Die Implementierung des ShareActionProviders ist damit vollständig abgeschlossen. Wir sind nun bereit unser erstes Zitat mit Hilfe des ShareActionProviders mit anderen Anwendungen zu teilen.
4. Ausführen und Testen unserer Android App
Wir werden nun unsere App im Emulator auf einem Android Virtual Device ausführen und prüfen, ob der ShareActionProvider korrekt in die App Bar eingebunden wurde und auf welche Weise er die übergebenen Inhalte mit anderen Anwendungen teilt.
Unsere App starten wir dazu wie gewohnt über den Run > Run 'app' Menüeintrag, den wir über die obere Menüleiste erreichen.
Sobald unsere App auf dem AVD gestartet wurde, führen wir die folgenden Schritte aus:
- Wir navigieren zuerst von der MainActivity zur DetailActivity durch Anklicken eines ListView-Eintrags.
- In der geöffneten DetailActivity klicken wir auf den Overflow Menu-Button der App Bar.
- Anschließend klicken wir auf den Zitat teilen Menüeintrag im aufgeklappten Overflow Menu.
- Es erscheint ein Untermenü mit mehreren Share-Apps. Wir klicken auf die Gmail-App.
- Nun lässt der ShareActionProvider die Gmail-App vom Android System per impliziten Intent starten und lässt ihr die zu teilenden Inhalte darin übermitteln.
Auf dem Android Virtual Device sind mehrere Share-Apps installiert. Der ShareActionProvider hat alle zu unserem Share-Intent passenden Share-Apps in dem von ihm erzeugten Untermenü aufgelistet.
Durch Klicken auf einen der Untermenü-Einträge wird die ausgewählte App vom Android System gestartet und ihr der implizite Intent übergeben. Das Intent-Objekt enthält die Zitatinformationen, wodurch die ausgewählte Share-App in der Lage ist, die Inhalte für uns zu teilen.
Zusammenfassung
In dieser Lektion haben wir eine weitere sehr nützliche Funktion des Android Intent Systems kennengelernt, den ShareActionProvider, mit dessen Hilfe sehr einfach und intuitiv Inhalte mit anderen auf dem Android Gerät installierten Apps geteilt werden können.
Wie die entsprechenden Daten an den ShareActionProvider übermittelt werden und wie der ShareActionProvider für unsere Android App aktiviert wird, haben wir im theoretischen Teil dieser Lektion ausführlich behandelt. Dabei haben wir auch erfahren, wie der ShareActionProvider per XML einem bestimmten Menüeintrag zugewiesen wird.
Anschließend haben wir im praktischen Teil dieser Lektion einen ShareActionProvider für die DetailActivity unserer Android App aktiviert. Dazu wurde ein neuer Menüeintrag in das Options Menu der DetailActivity eingefügt und mit dem ShareActionProvider verknüpft.
Danach haben wir dem ShareActionProvider die zu teilenden Inhalte übergeben. Dies erfolgte in der DetailActivity-Klasse mit Hilfe eines impliziten Intents, der für den ShareActionProvider registriert werden musste. Der erzeugte implizite Intent trägt die zu teilenden Inhalte, den Zitattext und Zitatautor, in sich und wird vom ShareActionProvider zum Teilen der Inhalte genutzt.
Abschließend haben wir unsere Android App im Emulator auf einem Android Virtual Device ausgeführt und überprüft, ob der ShareActionProvider die ihm per impliziten Intent übergebenen Inhalte korrekt mit anderen Android Apps teilt.
In der nächsten Lektion werden wir einen Einstellungen-Bildschirm für unserer Android App implementieren. Dabei werden wir die Preference-API von Android näher kennenlernen, die für das Erstellen von einheitlichen App-Einstellungen verwendet wird.
Weiterführende Literatur
- Developer.android.com: ActionProvider Reference
- Developer.android.com: ShareActionProvider Support Library Reference
- Developer.android.com: ShareActionProvider Reference
- Developer.android.com: Guide – Adding an easy Share Action
Comments 6
Hallo Chris,
ich muss mich erstmal dem positiven Feedback meiner Vorgänger anschließen: Super Tutorial!
Mit diesem Kapitel habe ich aber eine Schwierigkeit:
Bei mir ist „android.support.v7.app.ActionBarActivity“ nicht bekannt. Ich weiß nicht, ob das die Ursache für mein Problem ist, aber wenn ich meine App ohne diesem Import starte (was ohne Fehlermeldung funktioniert) habe ich kein Drop-Down Menu, wenn ich auf den Teilen-Button klicke…
Danke für deine Hilfe!
Author
Hallo Eric,
danke für dein Lob!
Ist in deiner Gradle-Datei auf Modulebene deines Android Projekts die v7 appcompat library eingebunden? Sie müsste in der
build.gradle
Datei des app/ Ordners als Dependency eingebunden sein.In Teil 2 dieses Tutorials habe ich über die Support Library geschrieben: Android Tutorial: build.gradle Datei anpassen.
Pingback: Android Tutorial: Das SwipeRefreshLayout in Android
Hallo Chris,
vielen Dank für dieses wirklich sehr verständliche und detailierte Tutorial!
Habe es durchgearbeitet und es hat alles wunderbar funktioniert.
Falls Du eine Fortsetzung bzw ein neues Tutorial planst,
fände ich es schön wenn darin ein Beispiel mit einer Datenbankanbindung vorkommt.
Grüße Bernhard
Author
Hallo Bernhard,
vielen Dank für das positive Feedback und deinen Vorschlag!
Es wird in der Tat demnächst ein Tutorial über Datenbankanbindung in Android geben. Ich werde ein eigenständiges Spezial-Tutorial über Android und SQLite erstellen. Es wird aber noch eine Weile dauern.
Viele Grüße, Chris
Pingback: Android Tutorial: Mit impliziten Intent eine andere App aufrufen