Barras de la app

Las barras de la app son contenedores que proporcionan al usuario acceso a funciones y elementos de navegación clave. Existen dos tipos de barras de la app: las superiores y las inferiores. Su apariencia y propósito respectivos son los siguientes:

Tipo

Apariencia

Objetivo

Barra superior de la app

En la parte superior de la pantalla.

Proporciona acceso a tareas y datos clave. Por lo general, aloja un título, elementos de acción principales y ciertos elementos de navegación.

Barra de la app inferior

En la parte inferior de la pantalla.

Suele incluir elementos de navegación principales. También puede proporcionar acceso a otras acciones clave, como a través de un botón de acción flotante contenido.

Ejemplo de una barra de la app superior y una inferior
Figura 1: Una barra de la app superior (izquierda) y una barra de la app inferior (derecha).

Para implementar una barra de la app superior y una inferior, usa los elementos de componibilidad TopAppBar y BottomAppBar, respectivamente. Te permiten crear interfaces coherentes que encapsulan los controles de navegación y acción, y que se alinean con los principios de Material Design.

Barras superiores de la app

En la siguiente tabla, se describen los cuatro tipos de barras de la app superiores:

Tipo

Ejemplo

Pequeña: Para pantallas que no requieren mucha navegación ni acciones.

Barra superior de la app pequeña

Alineación centrada: Para pantallas que tienen una sola acción principal.

Barra superior de la app centrada

Mediano: Para pantallas que requieren una cantidad moderada de navegación y acciones.

Barra superior de la app mediana

Grande: Para pantallas que requieren mucha navegación y acciones.

Barra superior de la app grande

Superficie de la API

Los diversos elementos componibles que te permiten implementar las cuatro barras de la app superiores diferentes son bastante similares. Comparten varios parámetros clave:

  • title: Es el texto que aparece en la barra de la app.
  • navigationIcon: Es el ícono principal para la navegación. Aparece a la izquierda de la barra de la app.
  • actions: Son íconos que proporcionan al usuario acceso a acciones clave. Aparecen a la derecha de la barra de la app.
  • scrollBehavior: Determina cómo responde la barra de la app superior al desplazamiento del contenido interno del scaffold.
  • colors: Determina cómo aparece la barra de la app.

Comportamiento de desplazamiento

Puedes controlar cómo responde la barra de la app cuando el usuario se desplaza por el contenido interno del scaffold determinado. Para ello, crea una instancia de TopAppBarScrollBehavior y pásala a la barra de la app de la parte superior para el parámetro scrollBehavior.

Existen tres tipos de TopAppBarScrollBehavior. Son los siguientes:

  • enterAlwaysScrollBehavior: Cuando el usuario levanta el contenido interno del scaffold, la barra superior de la app se contrae. La barra de la app se expande cuando el usuario comienza a deslizar hacia abajo el contenido interno.
  • exitUntilCollapsedScrollBehavior: Es similar a enterAlwaysScrollBehavior, aunque la barra de la app solo se expande cuando el usuario arrastra el contenido por completo hacia abajo.
  • pinnedScrollBehavior: La barra de la app permanece en su lugar y no reacciona al desplazamiento.

En los siguientes ejemplos, se implementan varias de estas opciones.

Ejemplos

En las siguientes secciones, se proporcionan implementaciones para los cuatro tipos diferentes de barras de la app superiores, incluidos varios ejemplos de cómo puedes controlar el comportamiento de desplazamiento.

Pequeño

Para crear una barra superior de la app pequeña, usa el elemento de componibilidad TopAppBar. En el siguiente ejemplo, se implementa una barra de la app superior básica que solo contiene un título.

En el siguiente ejemplo, no se pasa un valor para scrollBehavior a TopAppBar y, por lo tanto, no reacciona al desplazamiento del contenido 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)
    }
}

Esta implementación se ve de la siguiente manera:

Ejemplo de una barra de la app superior pequeña
Figura 2: Barra superior de la app pequeña

Alineación centrada

La barra superior de la app alineada al centro es, en esencia, igual que la barra de la app pequeña, aunque el título está centrado dentro del componente. Para implementarlo, usa el elemento componible CenterAlignedTopAppBar dedicado.

En este ejemplo, se usa enterAlwaysScrollBehavior() para obtener el valor que pasa para scrollBehavior. Por lo tanto, la barra se contrae cuando el usuario se desplaza por el contenido interno del 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.AutoMirrored.Filled.ArrowBack,
                            contentDescription = "Localized description"
                        )
                    }
                },
                actions = {
                    IconButton(onClick = { /* do something */ }) {
                        Icon(
                            imageVector = Icons.Filled.Menu,
                            contentDescription = "Localized description"
                        )
                    }
                },
                scrollBehavior = scrollBehavior,
            )
        },
    ) { innerPadding ->
        ScrollContent(innerPadding)
    }
}

Esta implementación se ve de la siguiente manera:

Ejemplo de una barra superior de la app alineada al centro
Figura 3: Barra superior de la app alineada al centro

Medio

La barra superior de la app mediana coloca el título debajo de los íconos adicionales. Para crear uno, usa el elemento componible MediumTopAppBar.

Al igual que el fragmento anterior, en este ejemplo, se usa enterAlwaysScrollBehavior() para obtener el valor que se pasa 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.AutoMirrored.Filled.ArrowBack,
                            contentDescription = "Localized description"
                        )
                    }
                },
                actions = {
                    IconButton(onClick = { /* do something */ }) {
                        Icon(
                            imageVector = Icons.Filled.Menu,
                            contentDescription = "Localized description"
                        )
                    }
                },
                scrollBehavior = scrollBehavior
            )
        },
    ) { innerPadding ->
        ScrollContent(innerPadding)
    }
}

Esta implementación aparece de la siguiente manera, con una demostración de cómo aparece el comportamiento de desplazamiento de enterAlwaysScrollBehavior():

Figura 4: Una barra de la app superior mediana que se contrae cuando el usuario se desplaza hacia arriba y se expande cuando se desplaza hacia abajo.

Grande

Una barra de la app superior grande es similar a la mediana, aunque el padding entre el título y los íconos es mayor y ocupa más espacio en la pantalla en general. Para crear uno, usa el elemento componible LargeTopAppBar.

A diferencia de los fragmentos anteriores, en este ejemplo, se usa exitUntilCollapsedScrollBehavior() para obtener el valor que se pasa para scrollBehavior. Por lo tanto, la barra se contrae cuando el usuario se desplaza por el contenido interno del scaffold, pero se expande cuando el usuario se desplaza hasta el final del contenido 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.AutoMirrored.Filled.ArrowBack,
                            contentDescription = "Localized description"
                        )
                    }
                },
                actions = {
                    IconButton(onClick = { /* do something */ }) {
                        Icon(
                            imageVector = Icons.Filled.Menu,
                            contentDescription = "Localized description"
                        )
                    }
                },
                scrollBehavior = scrollBehavior
            )
        },
    ) { innerPadding ->
        ScrollContent(innerPadding)
    }
}

Esta implementación se ve de la siguiente manera:

Una pantalla en una app con una barra de la app inferior que contiene cuatro íconos de acción en el lado izquierdo y un botón de acción flotante en el derecho.
Figura 5: Ejemplo de implementación de una barra de la app superior grande.

Barra de la app inferior

Para crear una barra de la app inferior, usa el elemento de componibilidad BottomAppBar. El uso de este elemento componible es bastante similar al de los elementos componibles de la barra superior de la app que se describen en las secciones anteriores de esta página. Pasas elementos componibles para los siguientes parámetros clave:

  • actions: Es una serie de íconos que aparecen en el lado izquierdo de la barra. Por lo general, son acciones clave para la pantalla determinada o elementos de navegación.
  • floatingActionButton: Es el botón de acción flotante que aparece en el lado derecho de la 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."
        )
    }
}

Esta implementación se ve de la siguiente manera:

Una pantalla en una app con una barra de la app inferior que contiene cuatro íconos de acción en el lado izquierdo y un botón de acción flotante en el derecho.
Figura 6: Ejemplo de implementación de una barra de la app inferior.

Recursos adicionales