Column — is een ingebouwde Composable-component van Jetpack Compose uit het pakket compose.foundation.layout, die onderliggende elementen verticaal plaatst, de een onder de ander. Column is de analoog van LinearLayout met verticale oriëntatie uit het oude View-systeem, maar gebruikt in tegenstelling hiermee een declaratieve beschrijving en reageert automatisch op toestandsveranderingen. Volgens Google Android Developers, 2026 is Column een van de drie basiscontainers naast Row en Box.
Belangrijkste
Column — is een Composable-functie die optionele parameters accepteert: modifier, verticalArrangement, horizontalAlignment en content — een lambda met ColumnScope. Binnen Column worden onderliggende Composable-functies van boven naar beneden geplaatst in de volgorde van declaratie. De hoogte van Column is gelijk aan de som van de hoogten van onderliggende elementen plus de ruimte bepaald door Arrangement. Breedte — volgens de maximale breedte van het onderliggende element rekening houdend met Alignment.
Column is een onzichtbare container: het heeft standaard geen eigen achtergrond of rand. Als een achtergrond nodig is — voeg Modifier.background() toe aan Column zelf. In tegenstelling tot LazyColumn geeft Column alle onderliggende elementen tegelijk weer en ondersteunt het geen virtualisatie. Dit betekent dat Column alleen geschikt is voor kleine datasets — tot 10-15 elementen. Voor lange lijsten gebruik je LazyColumn.
ColumnScope — is een receiver voor de content-lambda van Column. Het biedt extra modifiers die alleen binnen Column werken: weight(), align(), alignByBaseline(). Deze modifiers hebben geen betekenis buiten Column omdat ze vertrouwen op de specificiteit van verticale plaatsing. Bijvoorbeeld, Modifier.align(Alignment.CenterHorizontally) lijnt het onderliggende element horizontaal uit in het midden van Column.
VerticalArrangement bepaalt hoe de verticale ruimte tussen elementen wordt verdeeld. Beschikbare waarden: Arrangement.Top (standaard), Bottom, Center, SpaceBetween, SpaceEvenly, SpaceAround. Als de hoogte van Column groter is dan de som van de hoogtes van elementen, verdeelt Arrangement de vrije ruimte. Als elementen de hele hoogte innemen — heeft Arrangement geen effect.
HorizontalAlignment stelt de horizontale uitlijning van elk onderliggend element in. Alignment.Start (standaard, LTR), CenterHorizontally, End. Alignment werkt onafhankelijk op elk element: als een element smal is en een ander breed — wordt de eerste uitgelijnd, de tweede kan buiten de grenzen van Column vallen. Alignment werkt alleen als Column een vaste breedte of fillMaxWidth heeft.
Modifier voor Column: Column accepteert een Modifier die op de container zelf wordt toegepast. Modifier.fillMaxWidth(), fillMaxHeight(), size(), padding() — alle standaard modifiers werken. Bijzonderheid: Modifier.height(IntrinsicSize.Min) dwingt Column om de minimale hoogte te berekenen op basis van onderliggende elementen rekening houdend met Intrinsic measurement.
@Composable
fun ColumnArrangementDemo() {
Column(
modifier = Modifier.fillMaxSize().background(Color(0xFFF5F5F5)),
verticalArrangement = Arrangement.SpaceEvenly,
horizontalAlignment = Alignment.CenterHorizontally
) {
Text("Boven", modifier = Modifier.background(Color.Cyan))
Text("Midden", modifier = Modifier.background(Color.Magenta))
Text("Onder", modifier = Modifier.background(Color.Yellow))
}
}
// IntrinsicSize: Column past hoogte aan inhoud aan
@Composable
fun IntrinsicColumn() {
Column(
modifier = Modifier
.height(IntrinsicSize.Min)
.width(200.dp)
) {
Text("Korte tekst")
Text("Een zeer lange tekst die in de kolom wordt omwikkeld")
}
}
| Arrangement | Gedrag |
|---|---|
| Arrangement.Top | Elementen tegen de bovenkant, vrije ruimte onderaan |
| Arrangement.Center | Elementen in het midden, ruimte gelijk verdeeld boven en onder |
| Arrangement.SpaceBetween | Eerste element boven, laatste onder, rest gelijkmatig |
| Arrangement.SpaceEvenly | Gelijke tussenruimtes tussen alle elementen en randen |
| Arrangement.SpaceAround | Gelijke tussenruimtes tussen elementen, helft aan randen |
Modifier.weight() — is een ColumnScope-modifier die vrije verticale ruimte tussen Column-elementen proportioneel verdeelt volgens opgegeven gewichten. Als Column 400dp hoogte inneemt en onderliggende elementen in totaal 100dp, dan worden de resterende 300dp verdeeld tussen weight-elementen. Een element met weight(2f) krijgt twee keer zoveel ruimte als een element met weight(1f).
fill — de tweede parameter van weight: weight(weight: Float, fill: Boolean = true). Als fill = true (standaard), wordt het element uitgerekt tot de volledige beschikbare hoogte. Als fill = false — neemt het element alleen zijn intrinsieke hoogte in, de resterende ruimte blijft leeg. Dit is handig wanneer het element tegen een kant moet worden gedrukt, maar weight alleen de verhouding van lege ruimteverdeling bepaalt.
Beperkingen van weight: weight werkt alleen in Column met vaste hoogte of fillMaxHeight(). Als de hoogte van Column wordt bepaald door onderliggende elementen (wrap content), hebben gewichten geen zin — er is geen vrije ruimte om te verdelen. Ook kan weight niet worden gecombineerd met Modifier.height() op hetzelfde element — ze conflicteren en weight wordt genegeerd.
@Composable
fun WeightedColumn() {
Column(
modifier = Modifier.fillMaxHeight().width(300.dp)
) {
// Neemt 1/6 van hoogte (gewicht 1 van som 1+2+3=6)
Box(
modifier = Modifier
.weight(1f)
.fillMaxWidth()
.background(Color.Red)
)
// Neemt 2/6 van hoogte
Box(
modifier = Modifier
.weight(2f)
.fillMaxWidth()
.background(Color.Green)
)
// Neemt 3/6 van hoogte
Box(
modifier = Modifier
.weight(3f)
.fillMaxWidth()
.background(Color.Blue)
)
}
}
Column geeft alle onderliggende elementen tegelijk weer. Als er meer dan 10-15 elementen zijn, veroorzaakt Column een aanzienlijke belasting op compositie en meting. LazyColumn daarentegen rendert alleen zichtbare elementen en hergebruikt onzichtbare. Voor lange lijsten, lijsten met duizenden elementen, oneindige lijsten of chats — is LazyColumn verplicht.
Wanneer Column beter is: schermen met formulieren (3-10 velden), profielkaarten, verticale kolommen met pictogrammen, menu's. Column ondersteunt ook IntrinsicSize, wat handig is voor adaptieve hoogte. Bovendien is Column gemakkelijker te debuggen — geen virtualisatie, alle elementen zijn zichtbaar in Layout Inspector. Voor statische UI is Column de juiste keuze.
LazyColumn biedt: item caching, key-based identity, animatie van toevoegen/verwijderen (animateItemPlacement), sticky headers. Als de lijst elementen van verschillende typen bevat (verschillende viewType) — gebruik dan LazyColumn met sealed class in items. Column ondersteunt geen sticky headers (ze moeten worden geëmuleerd via scrollable Column). LazyColumn ondersteunt ook LazyVerticalGrid bij gebruik van GridCells.
| Criterium | Column | LazyColumn |
|---|---|---|
| Aantal elementen | Tot 10-15 | Elk aantal |
| Prestatie | Rendert altijd alles | Alleen zichtbare + buffer |
| Scrolling | Via Modifier.verticalScroll | Ingebouwd |
| IntrinsicSize | Ondersteunt | Ondersteunt niet |
| Sticky headers | Nee (emulatie) | Ja (stickyHeader) |
| Elementanimatie | Geen ingebouwde | animateItemPlacement |
Laten we het gebruikersprofiel-scherm bekijken, waar Column wordt gebruikt als hoofcontainer voor avatar, naam, bio en actieknoppen. Hier past Column met IntrinsicSize.Min zich aan de inhoud aan, en weight wordt toegepast voor het verdelen van ruimte tussen secties.
@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)
)
// Naam
Text(name, style = MaterialTheme.typography.headlineSmall)
// Bio
Text(bio, style = MaterialTheme.typography.bodyMedium,
modifier = Modifier.padding(top = 4.dp))
// Actieknoppen
Row(
horizontalArrangement = Arrangement.spacedBy(12.dp),
modifier = Modifier.padding(top = 12.dp)
) {
Button(onClick = { }) { Text("Bericht") }
OutlinedButton(onClick = { }) { Text("Volgen") }
}
}
}
}
In het voorbeeld gebruikt Column Arrangement.spacedBy(8.dp) voor gelijkmatige tussenruimtes tussen elementen. horizontalAlignment = CenterHorizontally centreert de avatar, naam en bio. Row binnen Column — een geneste container voor knoppen in één rij. Zo'n combinatie van Column (verticale plaatsing) en Row (horizontale plaatsing) is een typisch patroon voor UI-constructie in Compose.
Veelgestelde vragen
Column rendert alle onderliggende elementen tegelijk, wat bij 100+ elementen FPS-daling veroorzaakt. LazyColumn rendert alleen zichtbare elementen + buffer (meestal 3-5 schermen). Voor statische schermen met 3-10 elementen is Column sneller omdat er geen virtualisatie-overhead is.
Voeg Modifier.verticalScroll(rememberScrollState()) toe aan Column. Dit maakt Column scrollbaar, maar geeft geen virtualisatie — alle elementen worden nog steeds direct gerenderd. Voor lange scrollbare lijsten gebruik je LazyColumn.
Ja, nesten van Row/Column is normale praktijk. Door twee containers te combineren, kun je complexe grids bouwen. Vermijd echter diep nesten (4+ niveaus) zonder noodzaak — dit verhoogt het aantal LayoutNode-metingen en vertraagt de compositie.
Gebruik Modifier.fillMaxWidth() op elk onderliggend element. Als Column Modifier.fillMaxWidth() heeft, worden alle onderliggende elementen met fillMaxWidth() uitgerekt tot de volledige breedte. Alternatief: Modifier.weight(1f) in ColumnScope, als Column zich in een vaste container bevindt.
Arrangement.spacedBy(space) voegt een vaste tussenruimte toe tussen elk paar aangrenzende elementen. In tegenstelling tot SpaceBetween/SpaceAround rekt spacedBy de elementen niet uit — de tussenruimte is vast en de resterende ruimte blijft aan het einde van Column. spacedBy voegt geen ruimte toe vóór het eerste en na het laatste element.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook