Zu einem Ziel navigieren

Die Komponente „Navigation“ bietet eine einfache und allgemeine Möglichkeit, zu einem Ziel zu navigieren. Diese Schnittstelle unterstützt eine Reihe von Kontexten und UI-Frameworks. Sie können die Navigationskomponente beispielsweise mit der Funktion „Compose“, Ansichten, Fragmenten, Aktivitäten und sogar benutzerdefinierten UI-Frameworks verwenden.

In diesem Leitfaden wird beschrieben, wie Sie mit der Navigationskomponente in verschiedenen Kontexten zu einem Ziel navigieren können.

NavController verwenden

Der Schlüsseltyp, mit dem Sie zwischen Zielen wechseln, ist NavController. Weitere Informationen zur Klasse selbst und zum Erstellen einer Instanz dieser Klasse finden Sie unter Navigationscontroller erstellen. In diesem Leitfaden wird die Verwendung beschrieben.

Unabhängig davon, welches UI-Framework Sie verwenden, gibt es eine einzelne Funktion, mit der Sie zu einem Ziel wechseln können: NavController.navigate().

Für navigate() sind viele Überlastungen verfügbar. Die Überlastung, die Sie wählen sollten, entspricht genau Ihrem Kontext. Sie sollten beispielsweise eine Überlastung verwenden, wenn Sie zu einer zusammensetzbaren Funktion navigieren, und eine andere, wenn Sie zu einer Ansicht wechseln.

In den folgenden Abschnitten werden einige der navigate()-Schlüsselüberlastungen beschrieben, die Sie verwenden können.

Zu einer zusammensetzbaren Funktion wechseln

Mit NavController.navigate(route) können Sie im Navigationsdiagramm zu einer zusammensetzbaren Funktion wechseln. Bei dieser Überlastung verwendet navigate() ein einzelnes String-Argument. Dies ist die route. Sie dient als Schlüssel zu einem Ziel.

navController.navigate("friendslist")

Wenn Sie einen route-String zum Navigieren verwenden möchten, müssen Sie zuerst die NavGraph so erstellen, dass jedes Ziel einem route zugeordnet ist. Bei zusammensetzbaren Funktionen verwenden Sie dazu die Funktion composable().

Weitere Informationen finden Sie unter Zu einem Ziel navigieren.

Wenn eine zusammensetzbare Funktion zu einem neuen Bildschirm wechseln muss, sollten Sie keinen Verweis auf die NavController übergeben, damit sie navigate() direkt aufrufen kann. Gemäß den Prinzipien des Unidirektionalen Datenflusses (UDF) sollte die zusammensetzbare Funktion stattdessen ein Ereignis verfügbar machen, das von NavController verarbeitet wird.

Genauer gesagt sollte Ihre zusammensetzbare Funktion einen Parameter vom Typ () -> Unit haben. Wenn Sie Ihrem NavHost mit der Funktion composable() Ziele hinzufügen, übergeben Sie der zusammensetzbaren Funktion einen Aufruf an NavController.navigate().

Ein eindeutiges Beispiel hierfür finden Sie im folgenden Unterabschnitt.

Sehen Sie sich zur Veranschaulichung des vorherigen Abschnitts diese Punkte im folgenden Snippet an:

  1. Die zusammensetzbare Funktion MyAppNavHost enthält die Instanz NavController.
  2. Dementsprechend sollten navigate()-Aufrufe dort erfolgen und nicht in einer niedrigeren zusammensetzbaren Funktion wie ProfileScreen.
  3. ProfileScreen enthält eine Schaltfläche, über die der Nutzer zu FriendsList weitergeleitet wird, wenn er darauf klickt. Es wird jedoch nicht navigate() selbst aufgerufen.
  4. Stattdessen ruft die Schaltfläche eine Funktion auf, die als Parameter onNavigateToFriends verfügbar gemacht wird.
  5. Wenn MyAppNavHost dem Navigationsdiagramm ProfileScreen hinzufügt, übergibt es für onNavigateToFriends eine Lambda-Funktion, die navigate() aufruft.
  6. Dadurch wird sichergestellt, dass der Nutzer korrekt zu friendsList navigiert, wenn er auf die Schaltfläche ProfileScreen drückt.
@Composable
fun MyAppNavHost(
    modifier: Modifier = Modifier,
    navController: NavHostController = rememberNavController(),
    startDestination: String = "profile"
) {
    NavHost(
        modifier = modifier,
        navController = navController,
        startDestination = startDestination
    ) {
        composable("profile") {
            ProfileScreen(
                onNavigateToFriends = { navController.navigate("friendsList") },
                /*...*/
            )
        }
        composable("friendslist") { FriendsListScreen(/*...*/) }
    }
}

@Composable
fun ProfileScreen(
    onNavigateToFriends: () -> Unit,
    /*...*/
) {
    /*...*/
    Button(onClick = onNavigateToFriends) {
        Text(text = "See friends list")
    }
}

Mit Ganzzahl-ID navigieren

Rufen Sie die navigate(int)-Überlast auf, um mit einer Ganzzahl-ID zu einem Ziel zu gelangen. Er verwendet die Ressourcen-ID einer Aktion oder eines Ziels. Das folgende Code-Snippet zeigt, wie Sie mit dieser Überlastung zum ViewTransactionsFragment wechseln können:

Kotlin

viewTransactionsButton.setOnClickListener { view ->
  view.findNavController().navigate(R.id.viewTransactionsAction)
}

Java

viewTransactionsButton.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View view) {
      Navigation.findNavController(view).navigate(R.id.viewTransactionsAction);
  }
});

Wenn Sie IDs verwenden, sollten Sie nach Möglichkeit Aktionen verwenden. Aktionen liefern zusätzliche Informationen in Ihrem Navigationsdiagramm und zeigen visuell, wie Ihre Ziele miteinander verbunden sind.

Mit NavDeepLinkRequest navigieren

Verwenden Sie die navigate(NavDeepLinkRequest)-Überlastung, um ein implizites Deeplink-Ziel aufzurufen. Das folgende Snippet stellt eine Implementierung dieser Methode bereit:

Kotlin

val request = NavDeepLinkRequest.Builder
  .fromUri("android-app://androidx.navigation.app/profile".toUri())
  .build()
findNavController().navigate(request)

Java

NavDeepLinkRequest request = NavDeepLinkRequest.Builder
  .fromUri(Uri.parse("android-app://androidx.navigation.app/profile"))
  .build()
NavHostFragment.findNavController(this).navigate(request)

Im Gegensatz zur Navigation mit Aktions- oder Ziel-IDs können Sie jeden Deeplink in der Grafik aufrufen, unabhängig davon, ob das Ziel sichtbar ist. Sie können ein Ziel in der aktuellen Grafik oder ein Ziel auf einer ganz anderen Grafik aufrufen.

Aktionen und MIME-Typen

Zusätzlich zu Uri unterstützt NavDeepLinkRequest auch Deeplinks mit Aktionen und MIME-Typen. Verwenden Sie fromAction() oder setAction(), um der Anfrage eine Aktion hinzuzufügen. Verwenden Sie fromMimeType() oder setMimeType(), um einer Anfrage einen MIME-Typ hinzuzufügen.

Damit ein NavDeepLinkRequest mit einem impliziten Deeplink-Ziel korrekt übereinstimmt, müssen URI, Aktion und MIME-Typ mit dem NavDeepLink im Ziel übereinstimmen. URIs müssen dem Muster entsprechen, die Aktionen müssen genau übereinstimmen und die MIME-Typen müssen verwandt sein. Beispiel: image/jpg stimmt mit image/\* überein.

Weitere Kontexte

In diesem Dokument wird die Verwendung von NavController.navigate() in den gängigsten Anwendungsfällen beschrieben. Die Funktion hat jedoch eine Reihe von Überlasten, die Sie in verschiedenen Kontexten und in Verbindung mit jedem Ui-Framework verwenden können. Weitere Informationen zu diesen Überlastungen finden Sie in der Referenzdokumentation.

Weitere Informationen

Weitere Informationen finden Sie auf den folgenden Seiten: