In Ihrer Navigationsgrafik kann ein Ziel eine Aktivität sein. Es ist zwar empfehlenswert, in Ihrer App nur eine Aktivität zu verwenden, in vielen Apps werden jedoch separate Aktivitäten für verschiedene Komponenten oder Bildschirme innerhalb einer App verwendet. Aktivitätsziele können in solchen Fällen nützlich sein.
Compose und Kotlin DSL
Das Hinzufügen eines Aktivitätsziels zum Navigationsgraphen ist sowohl in Compose als auch bei Verwendung der Kotlin-DSL mit Fragmenten im Wesentlichen gleich. Das liegt daran,
verwenden Sie bei der Übergabe von NavGraph
an die zusammensetzbare Funktion NavHost
dasselbe
createGraph()
Lambda.
Weitere Informationen finden Sie unter Fragmente und die Kotlin-DSL.
XML
Das Erstellen eines Ziels für eine Aktivität ähnelt dem Erstellen eines Fragments. Ziel. Die Art eines Reiseziels ist jedoch ziemlich unterscheiden.
Standardmäßig hängt die Navigationsbibliothek das NavController
an ein
Activity
-Layout und das aktive Navigationsdiagramm bezieht sich auf das aktive
Activity
Wenn ein Nutzer zu einem anderen Activity
wechselt, wird die aktuelle
den Umfang des Navigationsdiagramms
nicht mehr berücksichtigt. Das bedeutet, dass ein Activity
-Ziel als Endpunkt in einem Navigationsgraphen betrachtet werden sollte.
Um ein Aktivitätsziel hinzuzufügen, geben Sie das Ziel Activity
mit seinen
voll qualifizierter Klassenname:
<?xml version="1.0" encoding="utf-8"?> <navigation xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/navigation_graph" app:startDestination="@id/simpleFragment"> <activity android:id="@+id/sampleActivityDestination" android:name="com.example.android.navigation.activity.DestinationActivity" android:label="@string/sampleActivityTitle" /> </navigation>
Dieses XML entspricht dem folgenden Aufruf von startActivity()
:
Kotlin
startActivity(Intent(context, DestinationActivity::class.java))
Java
startActivity(new Intent(context, DestinationActivity.class));
Es kann Fälle geben, in denen dieser Ansatz nicht geeignet ist. Zum Beispiel haben Sie
möglicherweise keine Kompilierungszeitabhängigkeit von der Aktivitätsklasse,
bevorzugen die Indirektion bei einer impliziten Absicht. Die
intent-filter
im Manifesteintrag für das Ziel Activity
gibt vor, wie Sie das Ziel Activity
strukturieren müssen.
Betrachten Sie zum Beispiel die folgende Manifestdatei:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.navigation.activity">
<application>
<activity android:name=".DestinationActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<data
android:host="example.com"
android:scheme="https" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
</application>
</manifest>
Das entsprechende Activity
-Ziel muss mit konfiguriert werden
Die Attribute action
und data
stimmen mit denen im Manifesteintrag überein:
<?xml version="1.0" encoding="utf-8"?> <navigation xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/navigation_graph" app:startDestination="@id/simpleFragment"> <activity android:id="@+id/localDestinationActivity" android:label="@string/localActivityTitle" app:action="android.intent.action.VIEW" app:data="https://example.com" app:targetPackage="${applicationId}" /> </navigation>
Wenn Sie targetPackage
mit dem aktuellen applicationId
-Element angeben, wird die
Bereich zur aktuellen Anwendung, die die Haupt-App enthält.
Derselbe Mechanismus kann auch verwendet werden, wenn eine bestimmte App als Ziel festgelegt werden soll. Im folgenden Beispiel wird als Ziel eine App mit einem
applicationId
von com.example.android.another.app
.
<?xml version="1.0" encoding="utf-8"?> <navigation xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/navigation_graph" app:startDestination="@id/simpleFragment"> <activity android:id="@+id/localDestinationActivity" android:label="@string/localActivityTitle" app:action="android.intent.action.VIEW" app:data="https://example.com" app:targetPackage="com.example.android.another.app" /> </navigation>
Dynamische Argumente
In den vorherigen Beispielen wurden feste URLs verwendet, um zu Zielen zu gelangen. Möglicherweise
dynamische URLs unterstützen, bei denen zusätzliche Informationen im Rahmen des
URL Beispielsweise können Sie eine User-ID in einer URL mit einem Format wie diesem
https://example.com?userId=<actual user ID>
Verwenden Sie in diesem Fall dataPattern
anstelle des Attributs data
.
Anschließend können Sie Argumente angeben, die durch benannte Platzhalter in
den Wert dataPattern
:
<?xml version="1.0" encoding="utf-8"?> <navigation xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/navigation_graph" app:startDestination="@id/simpleFragment"> <activity android:id="@+id/localDestinationActivity" android:label="@string/localActivityTitle" app:action="android.intent.action.VIEW" app:dataPattern="https://example.com?userId={userId}" app:targetPackage="com.example.android.another.app"> <argument android:name="userId" app:argType="string" /> </activity> </navigation>
In diesem Beispiel können Sie einen userId
-Wert angeben, indem Sie entweder sichere Args verwenden
oder mit Bundle
:
Kotlin
navController.navigate(
R.id.localDestinationActivity,
bundleOf("userId" to "someUser")
)
Java
Bundle args = new Bundle();
args.putString("userId", "someUser");
navController.navigate(R.id.localDestinationActivity, args);
In diesem Beispiel wird someUser
durch {userId}
ersetzt und der URI-Wert wird erstellt:
https://example.com?userId=someUser