Layout canonici

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

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

I layout canonici supportano gli smartphone con schermi piccoli, nonché tablet, dispositivi pieghevoli e dispositivi ChromeOS. Derivati dalle indicazioni di Material Design, i layout sono sia estetici che 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 di alta qualità.

Elenco-dettagli

Wireframe del layout list-detail.

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 e uno per i dettagli. Gli utenti selezionano gli elementi dall'elenco per visualizzarne i dettagli. I link diretti nei dettagli rivelano contenuti aggiuntivi nel riquadro dei dettagli.

I display con larghezza espansa (vedi Utilizzare le classi di dimensioni delle finestre) possono ospitare contemporaneamente sia l' elenco che i dettagli. La selezione di una voce dell'elenco aggiorna il riquadro dei dettagli per mostrare i contenuti correlati dell'elemento selezionato.

I display con 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 una voce dell'elenco mostra i dettagli al posto dell'elenco. Quando sono visibili solo i dettagli, se premi il pulsante Indietro viene visualizzato di nuovo l'elenco.

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

  • Se un display con larghezza espansa che mostra sia l'elenco che i riquadri dei dettagli si restringe a una larghezza media o compatta, il riquadro dei dettagli rimane visibile e il riquadro dell'elenco viene nascosto.
  • Se un display con larghezza media o compatta ha visibile solo il riquadro dei dettagli e la classe di dimensioni della finestra si espande, l'elenco e i dettagli vengono mostrati insieme e l'elenco indica che è selezionato l'elemento corrispondente ai contenuti nel riquadro dei dettagli.
  • Se un display con larghezza media o compatta ha visibile solo il riquadro dell'elenco e si espande, l'elenco e un riquadro dei dettagli segnaposto vengono mostrati insieme.

list-detail è ideale per le app di messaggistica, i gestori di contatti, i browser di contenuti 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

Compose 的声明性范式支持用于作出如下判断的窗口大小类别逻辑:同时显示列表窗格和详情窗格(当宽度窗口大小类别为展开时),还是只显示列表窗格或详情窗格(当宽度窗口大小类别为中等或紧凑时)。

为确保单向数据传输,请提升所有状态,包括当前窗口大小类别和所选列表项(如有)的详情,以便所有可组合项都可以访问相应数据并进行正确的呈现。

当小窗口中只显示详情窗格时,添加 BackHandler 即可移除详情窗格并转为只显示列表窗格。BackHandler 不是应用整体导航的一部分,因为处理程序依赖于窗口大小类别和所选详情的状态。

ListDetailPaneScaffold 是一种高级可组合项,可简化列表-详情布局的实现。它会根据窗口大小类别自动处理窗格逻辑,并支持在窗格之间导航。

以下是使用 ListDetailPaneScaffold 的最小实现:

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

以下是此示例中的关键组件:

  • rememberListDetailPaneScaffoldNavigator:创建一个导航器,用于管理列表窗格和详情窗格之间的导航。
  • listPane:显示项列表。
  • detailPane:显示所选项的内容。

如需查看详细的实现示例,请参阅:

Feed

Wireframe del layout del feed.

Un layout feed dispone gli 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 di 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 degli elementi vicini.

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

Un layout feed supporta display di quasi tutte le dimensioni perché la griglia può adattarsi da una singola colonna scorrevole a un feed di contenuti scorrevole a più colonne.

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.

Riquadro di supporto

Wireframe del layout del riquadro di supporto.

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

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 la parte rimanente della finestra dell'app e presenta contenuti che supportano i contenuti principali.

I layout del riquadro di supporto funzionano bene sui display con larghezza espansa (vedi Utilizzare le classi di dimensioni delle finestre) in orientamento orizzontale. I display con larghezza media o compatta supportano la visualizzazione sia delle aree di visualizzazione primarie che secondarie 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 nella relazione tra i contenuti primari e secondari. I contenuti del riquadro secondario sono significativi solo in relazione ai contenuti primari; ad esempio, una finestra degli strumenti del riquadro di supporto è irrilevante di per sé. I contenuti supplementari nel riquadro dei dettagli di un layout elenco-dettagli, tuttavia, sono significativi anche senza i contenuti primari, ad esempio la descrizione di un prodotto da una scheda di prodotto.

I casi d'uso del riquadro di supporto includono:

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

Implementazione

Compose 支持窗口大小类别逻辑,可用于确定是同时显示主要内容和辅助内容,还是将辅助内容放置在其他位置。

提升所有状态,包括当前窗口大小类别以及与主要内容和辅助内容中的数据相关的信息。

对于较小宽度的显示屏,可将辅助内容放置在主要内容下方或底部动作条中。对于中等宽度和较大宽度的显示屏,可将辅助内容放置在主要内容旁边,并根据内容和可用空间适当调整辅助内容的大小。对于中等宽度的显示屏,可在主要内容和辅助内容之间平均分配显示空间。对于展开宽度,可为主要内容分配 70% 的空间,并为辅助内容分配 30% 的空间。

SupportingPaneScaffold 是一种高级可组合项,可简化对辅助窗格布局的实现。该可组合函数会根据窗口大小类别自动处理窗格逻辑,在大屏幕上并排显示窗格,或在小屏幕上隐藏辅助窗格。SupportingPaneScaffold 还支持窗格之间的导航。

以下是最低限度的实现:

@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
        }
    )
}
示例中的关键组件:

  • rememberSupportingPaneScaffoldNavigator:用于创建导航器以管理窗格可见性(例如,在紧凑型屏幕上隐藏或显示支持窗格)的可组合函数
  • mainPane:用于显示主要内容的可组合项
  • supportingPane:用于显示补充内容的可组合项

如需查看详细的实现示例,请参阅:

Risorse aggiuntive