Barras de apps

As barras de apps são contêineres que fornecem ao usuário acesso aos principais recursos e itens de navegação. Há dois tipos de barras de apps: a superior e a inferior. A aparência e o propósito deles são os seguintes:

Tipo

Aparência

Objetivo

Barra de apps superior

Na parte de cima da tela.

Dá acesso às principais tarefas e informações. Geralmente hospeda um título, itens de ação principais e alguns itens de navegação.

Barra de apps inferior

Na parte inferior da tela.

Normalmente inclui os principais itens de navegação. Também pode fornecer acesso a outras ações importantes, como um botão de ação flutuante contido.

Exemplo de uma barra de apps na parte de cima e de baixo da tela.
Figura 1. Uma barra de apps na parte de cima (à esquerda) e outra na de baixo (à direita).

Para implementar uma barra de apps de cima e de baixo, use os elementos combináveis TopAppBar e BottomAppBar, respectivamente. Com elas, é possível criar interfaces consistentes que encapsulam controles de navegação e ação e que são alinhadas aos princípios do Material Design.

Principais barras de apps

A tabela a seguir descreve os quatro tipos de barras de apps principais:

Tipo

Exemplo

Pequeno: para telas que não exigem muita navegação ou ações.

Barra de apps superior pequena

Alinhado ao centro: para telas que têm uma única ação principal.

Barra de apps superior alinhada ao centro

Média: para telas que exigem navegação e ações moderadas.

Barra de apps média superior

Grande: para telas que exigem muitas ações e navegação.

Barra de apps superior grande

Plataforma da API

Os vários elementos combináveis que permitem implementar as quatro barras de apps principais diferentes são bastante semelhantes. Elas compartilham vários parâmetros principais:

  • title: o texto que aparece na barra de apps.
  • navigationIcon: o ícone principal de navegação. É exibido à esquerda da barra de apps.
  • actions: ícones que fornecem ao usuário acesso às principais ações. Eles aparecem à direita da barra de apps.
  • scrollBehavior: determina como a barra de apps superior responde à rolagem do conteúdo interno do scaffold.
  • colors: determina como a barra de apps vai aparecer.

Comportamento de rolagem

Você pode controlar como a barra de apps responde quando o usuário rola o conteúdo interno do scaffold. Para fazer isso, crie uma instância de TopAppBarScrollBehavior e a transmita à barra de apps de cima para o parâmetro scrollBehavior.

Há três tipos de TopAppBarScrollBehavior. Eles são os seguintes:

  • enterAlwaysScrollBehavior: quando o usuário extrai o conteúdo interno do scaffold, a barra de apps superior é recolhida. A barra de apps se expande quando o usuário puxa o conteúdo interno para baixo.
  • exitUntilCollapsedScrollBehavior: semelhante a enterAlwaysScrollBehavior, embora a barra de apps também se expanda quando o usuário chega ao fim do conteúdo interno do scaffold.
  • pinnedScrollBehavior: a barra de apps permanece no lugar e não reage à rolagem.

Os exemplos a seguir implementam várias dessas opções.

Exemplos

As seções abaixo fornecem implementações para os quatro tipos diferentes de barras de apps principais, incluindo exemplos variados de como controlar o comportamento de rolagem.

Pequeno

Para criar uma barra de apps superior pequena, use o elemento combinável TopAppBar. Essa é a barra de apps superior mais simples possível e, neste exemplo, contém apenas um título.

O exemplo a seguir não transmite um valor a TopAppBar para scrollBehavior e, portanto, não reage à rolagem do conteúdo interno.

@Composable
fun SmallTopAppBarExample() {
    Scaffold(
        topBar = {
            TopAppBar(
                colors = TopAppBarDefaults.topAppBarColors(
                    containerColor = MaterialTheme.colorScheme.primaryContainer,
                    titleContentColor = MaterialTheme.colorScheme.primary,
                ),
                title = {
                    Text("Small Top App Bar")
                }
            )
        },
    ) { innerPadding ->
        ScrollContent(innerPadding)
    }
}

Essa implementação aparece da seguinte forma:

Exemplo de uma pequena barra de apps superior.
Figura 2. Uma pequena barra de apps superior.

Alinhado ao centro

A barra de apps superior alinhada ao centro é essencialmente igual à pequena barra de apps, embora o título esteja centralizado no componente. Para implementá-lo, use o elemento combinável CenterAlignedTopAppBar dedicado.

Este exemplo usa enterAlwaysScrollBehavior() para receber o valor transmitido para scrollBehavior. Dessa forma, a barra é recolhida quando o usuário rola o conteúdo interno do scaffold.

@Composable
fun CenterAlignedTopAppBarExample() {
    val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState())

    Scaffold(
        modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),

        topBar = {
            CenterAlignedTopAppBar(
                colors = TopAppBarDefaults.topAppBarColors(
                    containerColor = MaterialTheme.colorScheme.primaryContainer,
                    titleContentColor = MaterialTheme.colorScheme.primary,
                ),
                title = {
                    Text(
                        "Centered Top App Bar",
                        maxLines = 1,
                        overflow = TextOverflow.Ellipsis
                    )
                },
                navigationIcon = {
                    IconButton(onClick = { /* do something */ }) {
                        Icon(
                            imageVector = Icons.Filled.ArrowBack,
                            contentDescription = "Localized description"
                        )
                    }
                },
                actions = {
                    IconButton(onClick = { /* do something */ }) {
                        Icon(
                            imageVector = Icons.Filled.Menu,
                            contentDescription = "Localized description"
                        )
                    }
                },
                scrollBehavior = scrollBehavior,
            )
        },
    ) { innerPadding ->
        ScrollContent(innerPadding)
    }
}

Essa implementação aparece da seguinte forma:

Escreva o texto alternativo aqui
Figura 3. Uma barra de apps superior alinhada ao centro.

Mídia

A barra de apps superior média coloca o título abaixo de todos os ícones adicionais. Para criar um, use o elemento combinável MediumTopAppBar.

Como o snippet anterior, esse exemplo usa enterAlwaysScrollBehavior() para receber o valor transmitido para scrollBehavior.

@Composable
fun MediumTopAppBarExample() {
    val scrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior(rememberTopAppBarState())

    Scaffold(
        modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
        topBar = {
            MediumTopAppBar(
                colors = TopAppBarDefaults.topAppBarColors(
                    containerColor = MaterialTheme.colorScheme.primaryContainer,
                    titleContentColor = MaterialTheme.colorScheme.primary,
                ),
                title = {
                    Text(
                        "Medium Top App Bar",
                        maxLines = 1,
                        overflow = TextOverflow.Ellipsis
                    )
                },
                navigationIcon = {
                    IconButton(onClick = { /* do something */ }) {
                        Icon(
                            imageVector = Icons.Filled.ArrowBack,
                            contentDescription = "Localized description"
                        )
                    }
                },
                actions = {
                    IconButton(onClick = { /* do something */ }) {
                        Icon(
                            imageVector = Icons.Filled.Menu,
                            contentDescription = "Localized description"
                        )
                    }
                },
                scrollBehavior = scrollBehavior
            )
        },
    ) { innerPadding ->
        ScrollContent(innerPadding)
    }
}

Essa implementação aparece da seguinte maneira, com uma demonstração de como o comportamento de rolagem de enterAlwaysScrollBehavior() aparece:

Figura 4. Uma barra de apps superior alinhada ao centro.

Grande

Uma barra de apps superior grande é semelhante à mídia, embora o padding entre o título e os ícones seja maior e ocupe mais espaço na tela em geral. Para criar um, use o elemento combinável LargeTopAppBar.

Ao contrário dos snippets anteriores, este exemplo usa exitUntilCollapsedScrollBehavior() para receber o valor transmitido para scrollBehavior. Dessa forma, a barra é recolhida quando o usuário rola o conteúdo interno do scaffold, mas se expande quando o usuário rola até o fim do conteúdo interno.

@Composable
fun LargeTopAppBarExample() {
    val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior(rememberTopAppBarState())

    Scaffold(
        modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
        topBar = {
            LargeTopAppBar(
                colors = TopAppBarDefaults.topAppBarColors(
                    containerColor = MaterialTheme.colorScheme.primaryContainer,
                    titleContentColor = MaterialTheme.colorScheme.primary,
                ),
                title = {
                    Text(
                        "Large Top App Bar",
                        maxLines = 1,
                        overflow = TextOverflow.Ellipsis
                    )
                },
                navigationIcon = {
                    IconButton(onClick = { /* do something */ }) {
                        Icon(
                            imageVector = Icons.Filled.ArrowBack,
                            contentDescription = "Localized description"
                        )
                    }
                },
                actions = {
                    IconButton(onClick = { /* do something */ }) {
                        Icon(
                            imageVector = Icons.Filled.Menu,
                            contentDescription = "Localized description"
                        )
                    }
                },
                scrollBehavior = scrollBehavior
            )
        },
    ) { innerPadding ->
        ScrollContent(innerPadding)
    }
}

Essa implementação aparece da seguinte forma:

Uma tela em um app com uma barra de apps inferior que contém os ícones de ação à esquerda e um botão de ação flutuante à direita.
Figura 5. Exemplo de implementação de uma barra de apps superior grande.

Barra de apps inferior

Para criar uma barra de apps na parte de baixo, use o elemento combinável BottomAppBar. O uso desse elemento é muito parecido com os principais elementos da barra de apps descritos nas seções anteriores desta página. Transmita os elementos combináveis para os seguintes parâmetros-chave:

  • actions: uma série de ícones que aparecem no lado esquerdo da barra. Geralmente, essas são as principais ações para a tela especificada ou itens de navegação.
  • floatingActionButton: o botão de ação flutuante que aparece no lado direito da barra.

@Composable
fun BottomAppBarExample() {
    Scaffold(
        bottomBar = {
            BottomAppBar(
                actions = {
                    IconButton(onClick = { /* do something */ }) {
                        Icon(Icons.Filled.Check, contentDescription = "Localized description")
                    }
                    IconButton(onClick = { /* do something */ }) {
                        Icon(
                            Icons.Filled.Edit,
                            contentDescription = "Localized description",
                        )
                    }
                    IconButton(onClick = { /* do something */ }) {
                        Icon(
                            Icons.Filled.Mic,
                            contentDescription = "Localized description",
                        )
                    }
                    IconButton(onClick = { /* do something */ }) {
                        Icon(
                            Icons.Filled.Image,
                            contentDescription = "Localized description",
                        )
                    }
                },
                floatingActionButton = {
                    FloatingActionButton(
                        onClick = { /* do something */ },
                        containerColor = BottomAppBarDefaults.bottomAppBarFabColor,
                        elevation = FloatingActionButtonDefaults.bottomAppBarFabElevation()
                    ) {
                        Icon(Icons.Filled.Add, "Localized description")
                    }
                }
            )
        },
    ) { innerPadding ->
        Text(
            modifier = Modifier.padding(innerPadding),
            text = "Example of a scaffold with a bottom app bar."
        )
    }
}

Essa implementação aparece da seguinte forma:

Uma tela em um app com uma barra de apps inferior que contém os ícones de ação à esquerda e um botão de ação flutuante à direita.
Figura 6. Exemplo de implementação de uma barra de apps na parte de baixo.

Outros recursos