O layout canônico do painel de suporte concentra a atenção do usuário no conteúdo principal do app e exibe conteúdo de suporte relevante. Por exemplo, o painel principal de conteúdo pode mostrar informações sobre um filme recente, enquanto o painel de suporte exibe uma lista de outros filmes com temas semelhantes ou com o mesmo diretor ou atores principais. Para mais informações sobre o layout canônico do painel de suporte, consulte as diretrizes do painel de suporte do Material 3.
Implementar um painel de suporte
O SupportingPaneScaffold
consiste em até três
painéis: um principal, um de suporte e um extra opcional. O esqueleto
processa todos os cálculos para alocar espaço da janela aos três painéis. Em
telas grandes, o esqueleto mostra o painel principal com o painel de suporte ao lado. Em telas pequenas, o esqueleto mostra o painel principal ou de suporte
em tela cheia.
![O conteúdo principal ocupa a maior parte da tela com o conteúdo de apoio ao lado.](https://developer.android.com/static/develop/ui/compose/images/layouts/adaptive/supporting-pane.png?authuser=0&hl=pt)
Adicionar dependências
SupportingPaneScaffold
faz parte da
biblioteca de layout adaptável do Material 3.
Adicione as três dependências relacionadas abaixo ao arquivo build.gradle
do seu
app ou módulo:
Kotlin
implementation("androidx.compose.material3.adaptive:adaptive") implementation("androidx.compose.material3.adaptive:adaptive-layout") implementation("androidx.compose.material3.adaptive:adaptive-navigation")
Groovy
implementation 'androidx.compose.material3.adaptive:adaptive' implementation 'androidx.compose.material3.adaptive:adaptive-layout' implementation 'androidx.compose.material3.adaptive:adaptive-navigation'
- adaptável: elementos básicos de baixo nível, como
HingeInfo
ePosture
- layout-adaptável: os layouts adaptáveis, como
SupportingPaneScaffold
. - adaptive-navigation: elementos combináveis para navegar dentro e entre os painéis.
Criar um navegador e um esqueleto
Em janelas pequenas, apenas um painel é exibido por vez. Use um
ThreePaneScaffoldNavigator
para alternar entre
painéis. Crie uma instância do navegador com
rememberSupportingPaneScaffoldNavigator
.
Para processar gestos de volta, use um BackHandler
que verifique
canNavigateBack()
e chame
navigateBack()
:
val navigator = rememberSupportingPaneScaffoldNavigator() BackHandler(navigator.canNavigateBack()) { navigator.navigateBack() }
O esqueleto exige um PaneScaffoldDirective
, que
controla como dividir a tela e quanto espaço usar, e um
ThreePaneScaffoldValue
, que fornece o estado
atual dos painéis (por exemplo, se eles estão abertos ou ocultos). Para o comportamento
padrão, use scaffoldDirective
e
scaffoldValue
do navegador, respectivamente:
SupportingPaneScaffold( directive = navigator.scaffoldDirective, value = navigator.scaffoldValue, mainPane = { /*...*/ }, supportingPane = { /*...*/ }, )
O painel principal e o de suporte são elementos combináveis que contêm seu conteúdo. Use
AnimatedPane
para aplicar as animações padrão do painel durante a
navegação. Use o valor de scaffold para conferir se o painel de suporte está
oculto. Nesse caso, mostre um botão que chame
navigateTo(ThreePaneScaffoldRole.Secondary)
para mostrar o
painel de suporte.
Confira uma implementação completa do esqueleto:
val navigator = rememberSupportingPaneScaffoldNavigator() BackHandler(navigator.canNavigateBack()) { navigator.navigateBack() } SupportingPaneScaffold( directive = navigator.scaffoldDirective, value = navigator.scaffoldValue, mainPane = { AnimatedPane(modifier = Modifier.safeContentPadding()) { // Main pane content if (navigator.scaffoldValue[SupportingPaneScaffoldRole.Supporting] == PaneAdaptedValue.Hidden) { Button( modifier = Modifier.wrapContentSize(), onClick = { navigator.navigateTo(SupportingPaneScaffoldRole.Supporting) } ) { Text("Show supporting pane") } } else { Text("Supporting pane is shown") } } }, supportingPane = { AnimatedPane(modifier = Modifier.safeContentPadding()) { // Supporting pane content Text("Supporting pane") } }, )
Extrair elementos combináveis do painel
Extraia os painéis individuais de um SupportingPaneScaffold
para os próprios
combináveis para torná-los reutilizáveis e testáveis. Use
ThreePaneScaffoldScope
para acessar AnimatedPane
se
você quiser as animações padrão:
@Composable fun ThreePaneScaffoldScope.MainPane( shouldShowSupportingPaneButton: Boolean, onNavigateToSupportingPane: () -> Unit, modifier: Modifier = Modifier, ) { AnimatedPane(modifier = modifier.safeContentPadding()) { // Main pane content if (shouldShowSupportingPaneButton) { Button(onClick = onNavigateToSupportingPane) { Text("Show supporting pane") } } else { Text("Supporting pane is shown") } } } @Composable fun ThreePaneScaffoldScope.SupportingPane( modifier: Modifier = Modifier, ) { AnimatedPane(modifier = modifier.safeContentPadding()) { // Supporting pane content Text("This is the supporting pane") } }
Extrair as panes em elementos combináveis simplifica o uso do
SupportingPaneScaffold
(compare o exemplo a seguir com a implementação completa
do scaffold na seção anterior):
val navigator = rememberSupportingPaneScaffoldNavigator() BackHandler(navigator.canNavigateBack()) { navigator.navigateBack() } SupportingPaneScaffold( directive = navigator.scaffoldDirective, value = navigator.scaffoldValue, mainPane = { MainPane( shouldShowSupportingPaneButton = navigator.scaffoldValue.secondary == PaneAdaptedValue.Hidden, onNavigateToSupportingPane = { navigator.navigateTo(ThreePaneScaffoldRole.Secondary) } ) }, supportingPane = { SupportingPane() }, )