Raggiungere una destinazione

Il componente Navigazione fornisce un modo semplice e generico di per raggiungere una destinazione. Questa interfaccia supporta una serie di contesti e UI i modelli di machine learning. Ad esempio, puoi utilizzare il componente Navigazione con Compose, viste, frammenti, attività e persino framework di UI personalizzati.

Questa guida descrive come utilizzare il componente Navigazione per accedere a un in vari contesti.

Usa un NavController

Il tipo di chiave che utilizzi per spostarti tra le destinazioni è NavController. Per ulteriori informazioni sul corso, consulta Creare un controller di navigazione. e come crearne un'istanza. Questa guida illustra nei dettagli come utilizzarlo.

Indipendentemente dal framework di UI utilizzato, è possibile utilizzare una sola funzione per raggiungere una destinazione: NavController.navigate().

Sono disponibili molti sovraccarichi per navigate(). L'overload che dovresti scegli corrisponde al tuo contesto esatto. Ad esempio, dovresti utilizzare uno il sovraccarico dovuto al passaggio a un componibile e a un altro durante l'esplorazione.

Le seguenti sezioni descrivono alcuni dei principali sovraccarichi di navigate() che puoi per gli utilizzi odierni.

Passa a un componibile

Per passare a un componibile, devi utilizzare NavController.navigate<T>. Con questo sovraccarico, navigate() prende un singolo argomento route per il quale passare un tipo. Serve da chiave per una destinazione.

@Serializable
object FriendsList

navController.navigate(route = FriendsList)

Per passare a un componibile nel grafico di navigazione, devi innanzitutto definire NavGraph in modo che ogni destinazione corrisponda a un tipo. Per componibili, puoi farlo tramite la funzione composable().

Esporre eventi dei componibili

Quando una funzione componibile deve passare a una nuova schermata, non devi passare un riferimento a NavController in modo che possa chiamare direttamente navigate(). In base ai principi della funzione Unidirectional Data Flow (UDF), il dovrebbe invece esporre un evento gestito da NavController.

In parole povere, il componibile deve avere un parametro di tipo () -> Unit. Quando aggiungi destinazioni a NavHost con il composable() , passa una chiamata componibile a NavController.navigate().

Vedi la sottosezione che segue per un esempio.

Esempio

Come dimostrazione delle sezioni precedenti, osserva questi punti nella seguente snippet:

  1. Ogni destinazione nel grafico viene creata utilizzando un percorso, ovvero una oggetto o classe serializzabile che descrive i dati richiesti destinazione.
  2. Il componibile MyAppNavHost contiene l'istanza NavController.
  3. Di conseguenza, le chiamate a navigate() dovrebbero avvenire lì e non in una località componibili come ProfileScreen.
  4. ProfileScreen contiene un pulsante che consente all'utente di accedere alla pagina FriendsList quando selezionato. Tuttavia, non esegue la chiamata a navigate().
  5. Il pulsante chiama invece una funzione esposta come parametro onNavigateToFriends.
  6. Quando MyAppNavHost aggiunge ProfileScreen al grafico di navigazione, per onNavigateToFriends passa una lambda che chiama navigate(route = FriendsList).
  7. In questo modo, quando l'utente preme il pulsante ProfileScreen, vai correttamente a FriendsListScreen.
@Serializable
object Profile
@Serializable
object FriendsList

@Composable
fun MyAppNavHost(
    modifier: Modifier = Modifier,
    navController: NavHostController = rememberNavController(),

) {
    NavHost(
        modifier = modifier,
        navController = navController,
        startDestination = Profile
    ) {
        composable<Profile> {
            ProfileScreen(
                onNavigateToFriends = { navController.navigate(route = FriendsList) },
                /*...*/
            )
        }
        composable<FriendsList> { FriendsListScreen(/*...*/) }
    }
}

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

Naviga utilizzando l'ID intero

Per raggiungere una destinazione utilizzando un ID intero, chiama navigate(int) un sovraccarico. Prende l'ID risorsa di un'azione o di una destinazione. La il seguente snippet di codice mostra come utilizzare questo sovraccarico per accedere ViewTransactionsFragment:

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);
  }
});

Quando utilizzi gli ID per la navigazione, devi utilizzare le azioni, ove possibile. Azioni fornire informazioni aggiuntive nel grafico di navigazione, che mostrano visivamente come le destinazioni si connettono tra loro.

Naviga con NavDeepLinkRequest

Per accedere a una destinazione implicita di link diretti, utilizza il metodo Sovraccarico di navigate(NavDeepLinkRequest). Lo snippet seguente fornisce un'immagine implementazione di questo metodo:

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)

A differenza della navigazione mediante ID azione o destinazione, puoi navigare verso qualsiasi nel grafico, indipendentemente dal fatto che la destinazione sia visibile o meno. Puoi raggiungere una destinazione nel grafico corrente o una destinazione un grafico diverso.

Azioni e tipi MIME

Oltre a Uri, NavDeepLinkRequest supporta anche i link diretti con azioni e tipi MIME. Per aggiungere un'azione alla richiesta, utilizza fromAction() oppure setAction(). Per aggiungere un tipo MIME a una richiesta: utilizza fromMimeType() o setMimeType().

Affinché un NavDeepLinkRequest corrisponda correttamente a una destinazione di link diretto implicito, l'URI, l'azione e il tipo MIME devono corrispondere tutti al NavDeepLink nel destinazione. Gli URI devono corrispondere al pattern, le azioni devono essere una corrispondenza esatta, e i tipi MIME devono essere correlati. Ad esempio, image/jpg corrisponde a image/\*

Ulteriori contesti

Questo documento spiega come utilizzare NavController.navigate() nella maggior parte e casi d'uso comuni. Tuttavia, la funzione presenta una serie di sovraccarichi che puoi in diversi contesti e in coppia con qualsiasi framework Ui. Consulta le documentazione di riferimento per ulteriori dettagli su questi sovraccarichi.

Continua a leggere

Per ulteriori informazioni, consulta le seguenti pagine: