Jetpack Compose Column: por qué no funciona la centración y cómo solucionarlo

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

¿Por qué Column no obedece? La maldición de la centración en Jetpack Compose

\n

¿Alguna vez te has sentado por la noche con una taza de café, escribiendo código en Kotlin para Jetpack Compose, y de repente te has dado cuenta de que tu Column se niega obstinadamente a centrar el contenido? Añades Modifier.align(Alignment.CenterHorizontally) — y el texto sigue pegado al borde izquierdo. ¿Te suena?

\n

Este problema es todo un éxito en Stack Overflow. Miles de desarrolladores (y yo entre ellos) se han golpeado la cabeza contra la pantalla tratando de entender dónde quedó el "gravity center". En este artículo analizaremos los principales errores que convierten tu Column en una lista incontrolable, y aprenderemos a evitarlos. Prepárate: habrá mucho código, ejemplos prácticos y nada de rodeos.

\n\n

Error n.º 1: Confusión entre Column y Row

\n

El primer y más común error es trasladar hábitos del Android XML clásico. Allí, LinearLayout tenía el atributo gravity="center". En Compose es diferente.

\n

Diferencia clave: Column coloca los elementos verticalmente. Por lo tanto, "centrar horizontalmente" no es una propiedad de la propia Column, sino el comportamiento de sus elementos hijos. Si escribes:

\n
Column(\n    modifier = Modifier.fillMaxSize(),\n    horizontalAlignment = Alignment.CenterHorizontally\n) {\n    Text("¡Hola, mundo!")\n}
\n

Aquí horizontalAlignment funciona, pero solo si el propio Text no está limitado en ancho. Y si tienes Modifier.fillMaxWidth() en el elemento hijo, la centración se rompe. ¿Por qué? Porque el elemento se estira a todo lo ancho, y ya no hay nada que centrar dentro de él.

\n\n

Error n.º 2: Modifier.align() en lugar de horizontalAlignment

\n

Aquí tienes el clásico código-trampa que circula por Stack Overflow:

\n
Column(\n    modifier = Modifier.fillMaxSize()\n) {\n    Text(\n        text = "Debería estar centrado",\n        modifier = Modifier.align(Alignment.CenterHorizontally)\n    )\n}
\n

A primera vista, parece lógico. Pero esto no funcionará si Column no tiene definido horizontalAlignment. El problema es que Modifier.align() es un modificador para Box y ColumnScope. Está disponible solo dentro de Column, pero funciona en conjunto con horizontalAlignment. Si este último no se especifica, align simplemente se ignora.

\n

Cómo solucionarlo:

\n
Column(\n    modifier = Modifier.fillMaxSize(),\n    horizontalAlignment = Alignment.CenterHorizontally  // ¡obligatorio!\n) {\n    Text(\n        text = "Ahora estoy centrado",\n        modifier = Modifier.align(Alignment.CenterHorizontally) // opcional\n    )\n}
\n\n

Error n.º 3: Olvidar Arrangement para la vertical

\n

A menudo los desarrolladores quieren centrar el contenido de Column verticalmente (en el eje Y). Aquí entra en juego verticalArrangement:

\n
Column(\n    modifier = Modifier.fillMaxSize(),\n    verticalArrangement = Arrangement.Center,\n    horizontalAlignment = Alignment.CenterHorizontally\n) {\n    Text("Centro del universo")\n    Button(onClick = { }) { Text("Botón") }\n}
\n

Pero hay un matiz: Arrangement.Center solo funcionará si Column ocupa toda la altura de la pantalla (Modifier.fillMaxSize() o Modifier.height(IntrinsicSize.Min)). Si la altura de Column es igual a la suma de las alturas de los elementos hijos, no habrá espacio para centrar.

\n\n

Error n.º 4: IntrinsicSize y comportamiento inesperado

\n

A veces añades Modifier.height(IntrinsicSize.Min) para que Column se ajuste al contenido. Y entonces la centración vertical se rompe:

\n
Column(\n    modifier = Modifier\n        .fillMaxWidth()\n        .height(IntrinsicSize.Min),\n    verticalArrangement = Arrangement.Center\n) {\n    Text("Texto 1")\n    Text("Texto 2")\n}
\n

Problema:

Blogs

Book Recommendations