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.
Naviga
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:
- Ogni destinazione nel grafico viene creata utilizzando un percorso, ovvero una oggetto o classe serializzabile che descrive i dati richiesti destinazione.
- Il componibile
MyAppNavHost
contiene l'istanzaNavController
. - Di conseguenza, le chiamate a
navigate()
dovrebbero avvenire lì e non in una località componibili comeProfileScreen
. ProfileScreen
contiene un pulsante che consente all'utente di accedere alla paginaFriendsList
quando selezionato. Tuttavia, non esegue la chiamata anavigate()
.- Il pulsante chiama invece una funzione esposta come parametro
onNavigateToFriends
. - Quando
MyAppNavHost
aggiungeProfileScreen
al grafico di navigazione, peronNavigateToFriends
passa una lambda che chiamanavigate(route = FriendsList
). - In questo modo, quando l'utente preme il pulsante
ProfileScreen
, vai correttamente aFriendsListScreen
.
@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:
- Creare un controller di navigazione
- Navigazione e pila posteriore
- Navigare con le opzioni
- Sicurezza dei caratteri in Kotlin DSL e Navigation Compose