La maggior parte delle app ha alcune destinazioni di primo livello accessibili tramite l'interfaccia utente di navigazione principale dell'app. Nelle finestre compatte, come il display di uno smartphone standard, le destinazioni vengono in genere visualizzate in una barra di navigazione nella parte inferiore della finestra. In una finestra espansa, ad esempio un'app a schermo intero su un tablet, una barra di navigazione accanto all'app è in genere una scelta migliore, poiché i controlli di navigazione sono più facili da raggiungere mentre si tengono i lati sinistro e destro del dispositivo.
NavigationSuiteScaffold semplifica il passaggio tra le UI di navigazione visualizzando l'UI di navigazione componibile appropriata in base a WindowSizeClass. Ciò include la modifica dinamica della UI durante le modifiche delle dimensioni della finestra di runtime. Il comportamento predefinito è mostrare uno dei seguenti componenti dell'interfaccia utente:
- Barra di navigazione se la larghezza o l'altezza sono compatte o se il dispositivo è in posizione da tavolo
- Barra di navigazione per tutto il resto
NavigationSuiteScaffold mostra una barra di navigazione nelle finestre compatte.
NavigationSuiteScaffold mostra una barra di navigazione nelle finestre espanse.
Aggiungi dipendenze
NavigationSuiteScaffold fa parte della libreria della suite di navigazione adattiva Material3. Aggiungi una dipendenza per la libreria nel file build.gradle della tua app o del tuo modulo:
Kotlin
implementation("androidx.compose.material3:material3-adaptive-navigation-suite")
Alla moda
implementation 'androidx.compose.material3:material3-adaptive-navigation-suite'
Crea un'impalcatura
Le due parti principali di NavigationSuiteScaffold sono gli elementi della suite di navigazione
e i contenuti della destinazione selezionata. Puoi definire direttamente gli elementi della suite di navigazione in un composable, ma è comune definirli altrove, ad esempio in un enum:
enum class AppDestinations( @StringRes val label: Int, val icon: ImageVector, @StringRes val contentDescription: Int ) { HOME(R.string.home, Icons.Default.Home, R.string.home), FAVORITES(R.string.favorites, Icons.Default.Favorite, R.string.favorites), SHOPPING(R.string.shopping, Icons.Default.ShoppingCart, R.string.shopping), PROFILE(R.string.profile, Icons.Default.AccountBox, R.string.profile), }
Per utilizzare NavigationSuiteScaffold, devi monitorare la destinazione corrente, cosa che puoi fare utilizzando rememberSaveable:
var currentDestination by rememberSaveable { mutableStateOf(AppDestinations.HOME) }
Nell'esempio seguente, il parametro navigationSuiteItems (tipo NavigationSuiteScope) utilizza la funzione item per definire l'interfaccia utente di navigazione per una singola destinazione. La UI di destinazione viene utilizzata nelle barre di navigazione, nelle barre laterali e nei riquadri a scomparsa. Per creare elementi di navigazione, esegui un loop su AppDestinations (definito nello snippet precedente):
NavigationSuiteScaffold( navigationSuiteItems = { AppDestinations.entries.forEach { item( icon = { Icon( it.icon, contentDescription = stringResource(it.contentDescription) ) }, label = { Text(stringResource(it.label)) }, selected = it == currentDestination, onClick = { currentDestination = it } ) } } ) { // TODO: Destination content. }
All'interno della funzione lambda dei contenuti di destinazione, utilizza il valore currentDestination per decidere quale UI visualizzare. Se utilizzi una libreria di navigazione nella tua app, usala qui per visualizzare la destinazione appropriata. Può essere sufficiente un'istruzione when:
NavigationSuiteScaffold( navigationSuiteItems = { /*...*/ } ) { // Destination content. when (currentDestination) { AppDestinations.HOME -> HomeDestination() AppDestinations.FAVORITES -> FavoritesDestination() AppDestinations.SHOPPING -> ShoppingDestination() AppDestinations.PROFILE -> ProfileDestination() } }
Cambia colori
NavigationSuiteScaffold crea un Surface sull'intera area
occupata dallo scaffold, in genere l'intera finestra. Inoltre, lo scaffold disegna la UI di navigazione specifica, ad esempio un NavigationBar.
Sia la superficie che l'interfaccia utente di navigazione utilizzano i valori specificati nel tema della tua app, ma puoi sostituirli.
Il parametro containerColor specifica il colore della superficie. L'impostazione predefinita è il colore di sfondo della combinazione di colori. Il parametro contentColor specifica il colore dei contenuti su quella superficie. Il valore predefinito è il colore "on" di qualsiasi elemento specificato per containerColor. Ad esempio, se containerColor utilizza il colore background, contentColor utilizza il colore onBackground.
Per ulteriori dettagli sul funzionamento del sistema di colori, consulta Temi di Material Design 3 in Compose. Quando esegui l'override di questi valori, utilizza i valori definiti nel tema in modo che l'app supporti le modalità di visualizzazione scura e chiara:
NavigationSuiteScaffold( navigationSuiteItems = { /* ... */ }, containerColor = MaterialTheme.colorScheme.primary, contentColor = MaterialTheme.colorScheme.onPrimary, ) { // Content... }
La UI di navigazione viene disegnata davanti alla superficie NavigationSuiteScaffold.
I valori predefiniti per i colori della UI sono forniti da NavigationSuiteDefaults.colors(), ma puoi anche eseguire l'override di questi valori. Ad esempio, se vuoi che lo sfondo della barra di navigazione sia trasparente, ma che gli altri valori siano quelli predefiniti, esegui l'override di navigationBarContainerColor:
NavigationSuiteScaffold( navigationSuiteItems = { /* ... */ }, navigationSuiteColors = NavigationSuiteDefaults.colors( navigationBarContainerColor = Color.Transparent, ) ) { // Content... }
In definitiva, puoi personalizzare ogni elemento nell'interfaccia utente di navigazione. Quando chiami la funzione item, puoi passare un'istanza di NavigationSuiteItemColors. La classe specifica i colori degli elementi in una barra di navigazione, una barra di spostamento e un riquadro di navigazione a scomparsa. Ciò significa che puoi avere colori identici per ogni tipo di UI di navigazione o puoi variare i colori in base alle tue esigenze. Definisci i colori a livello di NavigationSuiteScaffold per utilizzare la stessa istanza dell'oggetto per tutti gli elementi e chiama la funzione NavigationSuiteDefaults.itemColors() per eseguire l'override solo di quelli che vuoi modificare:
val myNavigationSuiteItemColors = NavigationSuiteDefaults.itemColors( navigationBarItemColors = NavigationBarItemDefaults.colors( indicatorColor = MaterialTheme.colorScheme.primaryContainer, selectedIconColor = MaterialTheme.colorScheme.onPrimaryContainer ), ) NavigationSuiteScaffold( navigationSuiteItems = { AppDestinations.entries.forEach { item( icon = { Icon( it.icon, contentDescription = stringResource(it.contentDescription) ) }, label = { Text(stringResource(it.label)) }, selected = it == currentDestination, onClick = { currentDestination = it }, colors = myNavigationSuiteItemColors, ) } }, ) { // Content... }
Personalizza i tipi di navigazione
Il comportamento predefinito di NavigationSuiteScaffold modifica la UI di navigazione in base alle classi di dimensioni della finestra. Tuttavia, potresti voler sovrascrivere questo comportamento. Ad esempio, se la tua app mostra un singolo riquadro di contenuti di grandi dimensioni per un feed, potrebbe utilizzare un riquadro di navigazione a scomparsa permanente per le finestre espanse, ma tornare comunque al comportamento predefinito per le classi di dimensioni delle finestre compatte e medie:
val adaptiveInfo = currentWindowAdaptiveInfo() val customNavSuiteType = with(adaptiveInfo) { if (windowSizeClass.isWidthAtLeastBreakpoint(WIDTH_DP_EXPANDED_LOWER_BOUND)) { NavigationSuiteType.NavigationDrawer } else { NavigationSuiteScaffoldDefaults.calculateFromAdaptiveInfo(adaptiveInfo) } } NavigationSuiteScaffold( navigationSuiteItems = { /* ... */ }, layoutType = customNavSuiteType, ) { // Content... }
Risorse aggiuntive
Indicazioni di Material Design:
Componenti della libreria
androidx.compose.material3: