Layout canonici

I layout canonici sono layout versatili e collaudati che offrono un'esperienza utente ottimale su una vasta gamma di fattori di forma.

Rappresentazione di dispositivi con schermo grande che mostrano i layout canonici.

I layout canonici supportano smartphone con schermi di piccole dimensioni, tablet, dispositivi pieghevoli e dispositivi ChromeOS. Derivati dalle indicazioni di Material Design, i layout sono estetici e funzionali.

Il framework Android include componenti specializzati che rendono l'implementazione dei layout semplice e affidabile.

I layout canonici creano UI coinvolgenti e che migliorano la produttività, che costituiscono la base di app eccezionali.

list-detail

Wireframe del layout elenco-dettagli.

Il layout elenco-dettagli consente agli utenti di esplorare elenchi di elementi che contengono informazioni descrittive, esplicative o altre informazioni supplementari, ovvero i dettagli dell'elemento.

Il layout divide la finestra dell'app in due riquadri affiancati: uno per l'elenco, uno per i dettagli. Gli utenti selezionano gli elementi dall'elenco per visualizzarne i dettagli. I link diretti nei dettagli mostrano contenuti aggiuntivi nel riquadro dei dettagli.

I display a larghezza estesa (vedi Utilizzare le classi di dimensioni delle finestre) mostrano contemporaneamente sia l'elenco che i dettagli. La selezione di un elemento dell'elenco aggiorna il riquadro dei dettagli per mostrare i contenuti correlati all'elemento selezionato.

I display di larghezza media e compatta mostrano l'elenco o i dettagli, a seconda dell'interazione dell'utente con l'app. Quando è visibile solo l'elenco, la selezione di un elemento dell'elenco mostra i dettagli al posto dell'elenco. Quando è visibile solo il dettaglio, se premi il pulsante Indietro viene visualizzato di nuovo l'elenco.

Le modifiche alla configurazione, come i cambiamenti di orientamento del dispositivo o le modifiche alle dimensioni della finestra dell'app, possono modificare la classe delle dimensioni della finestra del display. Un layout elenco-dettagli risponde di conseguenza, preservando lo stato dell'app:

  • Se un display a larghezza espansa che mostra sia il riquadro dell'elenco sia quello dei dettagli si restringe a medio o compatto, il riquadro dei dettagli rimane visibile e quello dell'elenco viene nascosto.
  • Se un display di larghezza media o compatta ha visibile solo il riquadro dei dettagli e la classe di dimensioni della finestra si allarga fino a diventare espansa, l'elenco e i dettagli vengono visualizzati insieme e l'elenco indica che l'elemento corrispondente ai contenuti nel riquadro dei dettagli è selezionato
  • Se un display di larghezza media o compatta ha visibile solo il riquadro dell'elenco e si allarga fino a essere espanso, vengono visualizzati insieme l'elenco e un riquadro dei dettagli segnaposto

L'interfaccia elenco-dettagli è ideale per app di messaggistica, gestori di contatti, browser multimediali interattivi o qualsiasi app in cui i contenuti possono essere organizzati come un elenco di elementi che rivelano informazioni aggiuntive.

Figura 1. App di messaggistica che mostra un elenco di conversazioni e i dettagli di una conversazione selezionata.

Implementazione

Il paradigma dichiarativo di Compose supporta la logica della classe di dimensioni della finestra che determina se mostrare contemporaneamente i riquadri elenco e dettagli (quando la classe di dimensioni della finestra in larghezza è espansa) o solo il riquadro elenco o dettagli (quando la classe di dimensioni della finestra in larghezza è media o compatta).

Per garantire il flusso di dati unidirezionale, solleva tutto lo stato, inclusi la classe di dimensioni della finestra corrente e i dettagli dell'elemento di elenco selezionato (se presente), in modo che tutti i composable abbiano accesso ai dati e possano essere visualizzati correttamente.

Quando viene visualizzato solo il riquadro dei dettagli in finestre di piccole dimensioni, aggiungi BackHandler per rimuovere il riquadro dei dettagli e visualizzare solo il riquadro dell'elenco. BackHandler non fa parte della navigazione complessiva dell'app, poiché l'handler dipende dalla classe di dimensioni della finestra e dallo stato dei dettagli selezionato.

ListDetailPaneScaffold è un composable di alto livello che semplifica l'implementazione di layout elenco-dettagli. Gestisce automaticamente la logica dei riquadri in base alle classi di dimensioni della finestra e supporta la navigazione tra i riquadri.

Ecco un'implementazione minima che utilizza ListDetailPaneScaffold:

@OptIn(ExperimentalMaterial3AdaptiveApi::class)
@Composable
fun MyListDetailPaneScaffold() {
    val navigator = rememberListDetailPaneScaffoldNavigator()
    ListDetailPaneScaffold(
        directive = navigator.scaffoldDirective,
        value = navigator.scaffoldValue,
        listPane = {
            // Listing Pane
        },
        detailPane = {
            // Details Pane
        }
    )
}

Di seguito sono riportati i componenti chiave di questo esempio:

  • rememberListDetailPaneScaffoldNavigator: crea un navigatore per gestire la navigazione tra i riquadri elenco e dettagli.
  • listPane: mostra l'elenco degli elementi.
  • detailPane: mostra i contenuti di un elemento selezionato.

Per esempi di implementazione dettagliati, vedi:

Feed

Wireframe del layout del feed.

Un layout feed dispone elementi di contenuti equivalenti in una griglia configurabile per una visualizzazione rapida e comoda di una grande quantità di contenuti.

Le dimensioni e la posizione stabiliscono le relazioni tra gli elementi dei contenuti.

I gruppi di contenuti vengono creati rendendo gli elementi delle stesse dimensioni e posizionandoli insieme. L'attenzione viene attirata sugli elementi rendendoli più grandi di quelli vicini.

Le schede e gli elenchi sono componenti comuni dei layout dei feed.

Un layout del feed supporta visualizzazioni di quasi tutte le dimensioni perché la griglia può adattarsi da una singola colonna scorrevole a un feed scorrevole multicolonna di contenuti.

I feed sono particolarmente adatti per le app di notizie e social media.

Figura 2. App di social media che mostra i post in schede di dimensioni diverse.

Implementazione

Un feed è costituito da un numero elevato di elementi di contenuti in un contenitore con scorrimento verticale disposti in una griglia. Le liste pigre eseguono il rendering in modo efficiente di un numero elevato di elementi in colonne o righe. Le griglie pigre eseguono il rendering degli elementi nelle griglie, supportando la configurazione delle dimensioni e degli intervalli degli elementi.

Configura le colonne del layout a griglia in base all'area di visualizzazione disponibile per impostare la larghezza minima consentita per gli elementi della griglia. Quando definisci gli elementi della griglia, regola l'estensione delle colonne per dare risalto ad alcuni elementi rispetto ad altri.

Per le intestazioni di sezione, i divisori o altri elementi progettati per occupare l'intera larghezza del feed, utilizza maxLineSpan per occupare l'intera larghezza del layout.

Sui display a larghezza compatta che non hanno spazio sufficiente per mostrare più di una colonna, LazyVerticalGrid si comporta esattamente come un LazyColumn.

Ecco un'implementazione minima che utilizza LazyVerticalGrid:

@Composable
fun MyFeed(names: List<String>) {
    LazyVerticalGrid(
        // GridCells.Adaptive automatically adapts column count based on available width
        columns = GridCells.Adaptive(minSize = 180.dp),
    ) {
        items(names) { name ->
            Text(name)
        }
    }
}

La chiave per un feed adattivo è la configurazione columns. GridCells.Adaptive(minSize = 180.dp) crea una griglia in cui ogni colonna è larga almeno 180.dp. La griglia mostra quindi il maggior numero di colonne possibile nello spazio disponibile.

Per un esempio di implementazione, consulta l'esempio di feed con Compose.

Pannello di supporto

Wireframe del layout del riquadro di supporto.

Il layout del riquadro di supporto organizza i contenuti dell'app in aree di visualizzazione primaria e secondaria.

L'area di visualizzazione principale occupa la maggior parte della finestra dell'app (in genere circa due terzi) e contiene i contenuti principali. L'area di visualizzazione secondaria è un riquadro che occupa il resto della finestra dell'app e presenta contenuti che supportano i contenuti principali.

I layout dei riquadri supportati funzionano bene su display con larghezza espansa (vedi Utilizzare le classi di dimensioni delle finestre) in orientamento orizzontale. I display di larghezza media o compatta supportano la visualizzazione sia dell'area di visualizzazione principale che di quella secondaria se i contenuti sono adattabili a spazi di visualizzazione più stretti o se i contenuti aggiuntivi possono essere inizialmente nascosti in un foglio inferiore o laterale accessibile tramite un controllo come un menu o un pulsante.

Un layout del riquadro di supporto differisce da un layout elenco-dettagli per la relazione tra i contenuti primari e secondari. I contenuti del riquadro secondario sono significativi solo in relazione ai contenuti principali; ad esempio, una finestra di supporto degli strumenti del riquadro non è pertinente di per sé. I contenuti supplementari nel riquadro dei dettagli di un layout elenco-dettagli, tuttavia, sono significativi anche senza i contenuti principali, ad esempio la descrizione di un prodotto da una scheda di prodotto.

I casi d'uso per il riquadro di supporto includono:

Figura 3. App di shopping con descrizioni dei prodotti in un riquadro di supporto.

Implementazione

Compose supporta la logica delle classi di dimensioni delle finestre, che ti consente di determinare se mostrare contemporaneamente i contenuti principali e quelli di supporto o posizionare i contenuti di supporto in una posizione alternativa.

Solleva tutto lo stato, inclusa la classe di dimensione della finestra corrente e le informazioni relative ai dati nel contenuto principale e nel contenuto di supporto.

Per i display con larghezza compatta, posiziona i contenuti di supporto sotto i contenuti principali o all'interno di un foglio inferiore. Per le larghezze medie ed estese, posiziona i contenuti di supporto accanto ai contenuti principali, dimensionati in modo appropriato in base ai contenuti e allo spazio disponibile. Per la larghezza media, dividi lo spazio di visualizzazione equamente tra i contenuti principali e quelli di supporto. Per la larghezza espansa, assegna il 70% dello spazio ai contenuti principali e il 30% ai contenuti di supporto.

SupportingPaneScaffold è un componente componibile di alto livello che semplifica l'implementazione dei layout dei riquadri di supporto. Il composable gestisce automaticamente la logica dei riquadri in base alle classi di dimensioni della finestra, visualizzando i riquadri uno accanto all'altro sugli schermi di grandi dimensioni o nascondendo il riquadro di supporto sugli schermi piccoli. SupportingPaneScaffold supporta anche la navigazione tra i riquadri.

Di seguito è riportata un'implementazione minima:

@OptIn(ExperimentalMaterial3AdaptiveApi::class)
@Composable
fun MySupportingPaneScaffold() {
    // Creates and remembers a navigator to control pane visibility and navigation
    val navigator = rememberSupportingPaneScaffoldNavigator()
    SupportingPaneScaffold(
        // Directive and value help control pane visibility based on screen size and state
        directive = navigator.scaffoldDirective,
        value = navigator.scaffoldValue,
        mainPane = {
            // Main Pane for the primary content
        },
        supportingPane = {
            //Supporting Pane for supplementary content
        }
    )
}
Componenti chiave nell'esempio:

  • rememberSupportingPaneScaffoldNavigator: composable che crea un navigatore per gestire la visibilità dei riquadri (ad esempio, nascondere o mostrare il riquadro di supporto sugli schermi compatti)
  • mainPane: composable che mostra i contenuti principali
  • supportingPane: composable che mostra i contenuti supplementari

Per esempi di implementazione dettagliati, vedi:

Risorse aggiuntive