Aktivitätsziele

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