Column: disposición vertical y configuración del contenedor en Compose

Autor: IT Sectr Publicado: 2026-06-28 Tiempo de lectura: 8 min

Column es un componente Composable integrado de Jetpack Compose del paquete compose.foundation.layout que organiza los elementos hijos verticalmente, uno debajo del otro. Column es el equivalente de LinearLayout con orientación vertical del antiguo sistema View, pero a diferencia de este, utiliza una descripción declarativa y reacciona automáticamente a los cambios de estado. Según Google Android Developers, 2026, Column es uno de los tres contenedores básicos junto con Row y Box.

Puntos clave

  • Column organiza elementos verticalmente con configuración de Arrangement y Alignment
  • Arrangement define la distribución del espacio entre elementos verticalmente
  • Alignment establece la alineación horizontal de cada elemento dentro de Column
  • Weight distribuye el espacio libre proporcionalmente entre los elementos
  • IntrinsicSize permite que Column ajuste su tamaño al ancho mínimo/máximo de los hijos

Qué es Column en Jetpack Compose

Column es una función Composable que acepta parámetros opcionales: modifier, verticalArrangement, horizontalAlignment y content — una lambda con ColumnScope. Dentro de Column, las funciones Composable hijas se organizan de arriba a abajo en el orden de declaración. La altura de Column es igual a la suma de las alturas de los hijos más el espacio especificado por Arrangement. El ancho es igual al ancho máximo del hijo considerando Alignment.

Column es un contenedor invisible: no tiene fondo ni borde por defecto. Si necesita un fondo, agregue Modifier.background() al propio Column. A diferencia de LazyColumn, Column renderiza todos los elementos hijos simultáneamente y no admite virtualización. Esto significa que Column solo es adecuado para conjuntos de datos pequeños — hasta 10-15 elementos. Para listas largas, use LazyColumn.

ColumnScope es el receptor de la lambda content de Column. Proporciona modificadores adicionales que solo funcionan dentro de Column: weight(), align(), alignByBaseline(). Estos modificadores no tienen sentido fuera de Column porque dependen de las particularidades del diseño vertical. Por ejemplo, Modifier.align(Alignment.CenterHorizontally) alinea un elemento hijo al centro de Column horizontalmente.

Parámetros de Column: Arrangement, Alignment, Modifier

VerticalArrangement determina cómo se distribuye el espacio vertical entre los elementos. Valores disponibles: Arrangement.Top (predeterminado), Bottom, Center, SpaceBetween, SpaceEvenly, SpaceAround. Si la altura de Column es mayor que la suma de las alturas de los elementos, Arrangement distribuye el espacio libre. Si los elementos ocupan toda la altura, Arrangement no tiene efecto.

HorizontalAlignment establece la alineación horizontal de cada elemento hijo. Alignment.Start (predeterminado para LTR), CenterHorizontally, End. Alignment actúa sobre cada elemento de forma independiente: si un elemento es estrecho y otro es ancho, el primero se alineará y el segundo puede extenderse más allá de los límites de Column. Alignment solo funciona si Column tiene un ancho fijo o fillMaxWidth.

Modifier para Column: Column acepta un Modifier que se aplica al propio contenedor. Modifier.fillMaxWidth(), fillMaxHeight(), size(), padding() — todos los modificadores estándar funcionan. Nota especial: Modifier.height(IntrinsicSize.Min) obliga a Column a calcular la altura mínima basada en los elementos hijos mediante la medición Intrinsic.

kotlin
@Composable
fun ColumnArrangementDemo() {
    Column(
        modifier = Modifier.fillMaxSize().background(Color(0xFFF5F5F5)),
        verticalArrangement = Arrangement.SpaceEvenly,
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
        Text("Arriba", modifier = Modifier.background(Color.Cyan))
        Text("Medio", modifier = Modifier.background(Color.Magenta))
        Text("Abajo", modifier = Modifier.background(Color.Yellow))
    }
}

    // IntrinsicSize: Column ajusta la altura al contenido
@Composable
fun IntrinsicColumn() {
    Column(
        modifier = Modifier
            .height(IntrinsicSize.Min)
            .width(200.dp)
    ) {
        Text("Texto corto")
        Text("Un texto muy largo que se ajustará dentro de la columna")
    }
}
ArrangementComportamiento
Arrangement.TopElementos pegados arriba, espacio libre abajo
Arrangement.CenterElementos centrados, espacio dividido equitativamente arriba y abajo
Arrangement.SpaceBetweenPrimer elemento arriba, último abajo, otros uniformemente
Arrangement.SpaceEvenlyEspacios iguales entre todos los elementos y los bordes
Arrangement.SpaceAroundEspacios iguales entre elementos, medios espacios en los bordes

Column weight: distribución del espacio entre elementos

Modifier.weight() es un modificador de ColumnScope que distribuye el espacio vertical libre entre los elementos de Column proporcionalmente a los pesos especificados. Si Column ocupa 400dp de altura y los elementos hijos suman 100dp, los 300dp restantes se dividen entre los elementos con weight. Un elemento con weight(2f) recibirá el doble de espacio que un elemento con weight(1f).

fill — el segundo parámetro de weight: weight(weight: Float, fill: Boolean = true). Si fill = true (predeterminado), el elemento se estira a toda la altura disponible. Si fill = false, el elemento solo ocupa su altura intrínseca y el espacio restante queda vacío. Esto es útil cuando un elemento debe estar pegado a un lado pero weight solo define la proporción de distribución del espacio vacío.

Limitaciones de weight: weight solo funciona en Column con altura fija o fillMaxHeight(). Si la altura de Column está determinada por los elementos hijos (wrap content), los pesos no tienen sentido — no hay espacio libre para distribuir. Además, weight no se puede combinar con Modifier.height() en el mismo elemento — entran en conflicto y weight se ignora.

kotlin
@Composable
fun WeightedColumn() {
    Column(
        modifier = Modifier.fillMaxHeight().width(300.dp)
    ) {
        // Toma 1/6 de la altura (weight 1 de suma 1+2+3=6)
        Box(
            modifier = Modifier
                .weight(1f)
                .fillMaxWidth()
                .background(Color.Red)
        )
        // Toma 2/6 de la altura
        Box(
            modifier = Modifier
                .weight(2f)
                .fillMaxWidth()
                .background(Color.Green)
        )
        // Toma 3/6 de la altura
        Box(
            modifier = Modifier
                .weight(3f)
                .fillMaxWidth()
                .background(Color.Blue)
        )
    }
}

Column vs LazyColumn: cuándo usar cada uno

Column renderiza todos los elementos hijos inmediatamente. Si hay más de 10-15 elementos, Column crea una carga significativa en la composición y medición. LazyColumn, por el contrario, solo renderiza los elementos visibles y reutiliza los invisibles. Para listas largas, listas con miles de elementos, listas infinitas o chats — LazyColumn es obligatorio.

Cuándo es mejor Column: pantallas con formularios (3-10 campos), tarjetas de perfil, columnas verticales con iconos, menús. Column también admite IntrinsicSize, útil para altura adaptativa. Además, Column es más fácil de depurar — no hay virtualización, todos los elementos son visibles en Layout Inspector. Para UI estática, Column es la opción correcta.

LazyColumn proporciona: caché de elementos, identidad basada en clave, animación de añadir/eliminar (animateItemPlacement), encabezados fijos (sticky headers). Si la lista contiene elementos de diferentes tipos (diferentes viewType), use LazyColumn con sealed class en items. Column no admite sticky headers (deben emularse mediante Column desplazable). Además, LazyColumn admite LazyVerticalGrid al usar GridCells.

CriterioColumnLazyColumn
Número de elementosHasta 10-15Cualquiera
RendimientoSiempre renderiza todoSolo visibles + buffer
DesplazamientoMediante Modifier.verticalScrollIntegrado
IntrinsicSizeCompatibleNo compatible
Sticky headersNo (emulación)Sí (stickyHeader)
Animación de elementosNo integradaanimateItemPlacement

Ejemplos prácticos de uso de Column

Veamos una pantalla de perfil de usuario donde Column se usa como contenedor principal para el avatar, nombre, bio y botones de acción. Aquí, Column con IntrinsicSize.Min se ajusta al contenido y weight se usa para distribuir el espacio entre secciones.

kotlin
@Composable
fun UserProfileCard(name: String, bio: String) {
    Card(
        modifier = Modifier.fillMaxWidth().padding(16.dp),
        elevation = CardDefaults.cardElevation(defaultElevation = 4.dp)
    ) {
        Column(
            modifier = Modifier.fillMaxWidth().padding(16.dp),
            horizontalAlignment = Alignment.CenterHorizontally,
            verticalArrangement = Arrangement.spacedBy(8.dp)
        ) {
            // Avatar
            Icon(
                imageVector = Icons.Default.AccountCircle,
                contentDescription = "Avatar",
                modifier = Modifier.size(64.dp)
            )
            // Nombre
            Text(name, style = MaterialTheme.typography.headlineSmall)
            // Bio
            Text(bio, style = MaterialTheme.typography.bodyMedium,
                modifier = Modifier.padding(top = 4.dp))
            // Botones de acción
            Row(
                horizontalArrangement = Arrangement.spacedBy(12.dp),
                modifier = Modifier.padding(top = 12.dp)
            ) {
                Button(onClick = { }) { Text("Mensaje") }
                OutlinedButton(onClick = { }) { Text("Seguir") }
            }
        }
    }
}

En el ejemplo, Column usa Arrangement.spacedBy(8.dp) para espacios uniformes entre elementos. horizontalAlignment = CenterHorizontally centra el avatar, nombre y bio. El Row dentro de Column es un contenedor anidado para los botones en una fila. Esta combinación de Column (disposición vertical) y Row (disposición horizontal) es un patrón típico de construcción de UI en Compose.

Preguntas frecuentes

¿En qué se diferencia Column de LazyColumn en términos de rendimiento?

Column renderiza todos los elementos hijos a la vez, lo que con 100+ elementos provoca caídas de FPS. LazyColumn solo renderiza los elementos visibles más un búfer (normalmente 3-5 pantallas). Para pantallas estáticas con 3-10 elementos, Column es más rápido ya que no hay sobrecarga de virtualización.

¿Cómo hacer que una Column sea desplazable?

Agregue Modifier.verticalScroll(rememberScrollState()) a Column. Esto hace que Column sea desplazable pero no proporciona virtualización — todos los elementos aún se renderizan a la vez. Para listas largas desplazables, use LazyColumn.

¿Se puede anidar Row dentro de Column y Column dentro de Row?

Sí, el anidamiento de Row/Column es una práctica común. Combinando los dos contenedores, se pueden construir cuadrículas complejas. Sin embargo, evite el anidamiento profundo (4+ niveles) sin necesidad — aumenta el número de mediciones de LayoutNode y ralentiza la composición.

¿Cómo hacer que todos los elementos en Column tengan el mismo ancho?

Use Modifier.fillMaxWidth() en cada elemento hijo. Si Column tiene Modifier.fillMaxWidth(), todos los hijos con fillMaxWidth() se estirarán a todo el ancho. Alternativa: use Modifier.weight(1f) en ColumnScope si Column está dentro de un contenedor fijo.

¿Cómo funciona spacedBy en Column?

Arrangement.spacedBy(space) agrega un espacio fijo entre cada dos elementos adyacentes. A diferencia de SpaceBetween/SpaceAround, spacedBy no estira los elementos — el espacio es fijo y el espacio restante queda al final de Column. spacedBy no agrega espacio antes del primer ni después del último elemento.

Resumen

  • Column — contenedor vertical básico de Compose para organizar elementos de arriba a abajo
  • Arrangement controla la distribución del espacio (Top, Center, SpaceBetween, spacedBy)
  • Alignment establece la alineación horizontal de cada elemento hijo
  • Weight distribuye el espacio libre proporcionalmente entre elementos
  • Column vs LazyColumn: Column para 3-10 elementos, LazyColumn para listas largas
  • IntrinsicSize permite que Column ajuste la altura a la medición mínima del hijo
  • Recomendación: use spacedBy para espacios entre elementos en lugar de padding en cada uno

Desarrollaremos una aplicación móvil llave en mano

IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.

Discutir el proyecto

Lea también