Miejsca docelowe aktywności

Miejscem docelowym na wykresie nawigacyjnym może być aktywność. Najlepiej, gdyby ćwiczą poszczególne działania w aplikacji, aplikacje często używają osobnych dla poszczególnych komponentów lub ekranów w aplikacji. Ćwiczenie miejsca docelowe mogą być w takich przypadkach przydatne.

Compose i Kotlin DSL

Dodawanie miejsca docelowego aktywności do wykresu nawigacyjnego wygląda tak samo zarówno w Compose, jak i podczas korzystania z DSL Kotlin z fragmentami. Dzieje się tak, ponieważ gdy przekazujesz NavGraph do funkcji kompozycyjnej NavHost, użyj tego samego createGraph() lambda.

Więcej informacji znajdziesz w sekcji Tworzenie wykresu programowo przy użyciu Kotlina DSL.

XML

Tworzenie miejsca docelowego aktywności przypomina tworzenie fragmentu miejsce docelowe. Charakter tego miejsca jest jednak w inny sposób.

Domyślnie biblioteka nawigacyjna dołącza NavController do elementu Activity, a aktywny wykres nawigacji ma zakres ograniczony do aktywnych Activity. Jeśli użytkownik przejdzie do innej usługi Activity, bieżące wykres nawigacyjny nie jest już w zakresie. Oznacza to, że Activity miejsce docelowe należy traktować jako punkt końcowy na wykresie nawigacji.

Aby dodać miejsce docelowe aktywności, określ miejsce docelowe Activity za pomocą pełna i jednoznaczna nazwa zajęć:

<?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>

Ten plik XML jest odpowiednikiem następującego wywołania startActivity():

Kotlin

startActivity(Intent(context, DestinationActivity::class.java))

Java

startActivity(new Intent(context, DestinationActivity.class));

Niekiedy takie podejście może być nieodpowiednie. Na przykład: może nie zależność czasu kompilowania od klasy aktywności lub możesz preferować poziom pośredniego realizowania zamiaru ukrytego. intent-filter we wpisie manifestu dla miejsca docelowego Activity określa strukturę miejsca docelowego Activity.

Weźmy na przykład ten plik manifestu:

<?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>

Odpowiednie miejsce docelowe Activity należy skonfigurować za pomocą Atrybuty action i data pasujące do tych we wpisie manifestu:

<?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>

Określenie targetPackage do bieżącej wartości applicationId ogranicza do bieżącej aplikacji, która zawiera aplikację główną.

Tego samego mechanizmu można użyć w sytuacjach, gdy konkretna aplikacja ma być miejsce docelowe. W tym przykładzie jako miejsce docelowe jest określona aplikacja z atrybutem applicationId z 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>

Argumenty dynamiczne

W poprzednich przykładach wykorzystywano stałe adresy URL do przechodzenia do miejsc docelowych. Możesz muszą również obsługiwać dynamiczne adresy URL, na które wysyłane są dodatkowe informacje w ramach Adres URL. Na przykład możesz wysłać identyfikator użytkownika w adresie URL w formacie podobnym do https://example.com?userId=<actual user ID>

W takim przypadku zamiast atrybutu data użyj dataPattern. Następnie możesz podać argumenty, które zostaną zastąpione nazwanymi zmiennymi w obrębie argumentu wartość 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>

W tym przykładzie możesz określić wartość userId, używając jednej z tych wartości: Safe Args lub za pomocą 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);

W tym przykładzie zastępujemy someUser zamiast {userId} i tworzymy wartość identyfikatora URI: https://example.com?userId=someUser