Column: verticale plaatsing en configuratie van de container in Compose

Auteur: IT Sectr Gepubliceerd: 2026-06-28 Leestijd: 8 min

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 plaatst elementen verticaal met Arrangement en Alignment
  • Arrangement bepaalt de ruimteverdeling tussen elementen verticaal
  • Alignment stelt de horizontale uitlijning van elk element binnen Column in
  • Gewicht (weight) verdeelt beschikbare ruimte proportioneel tussen elementen
  • IntrinsicSize laat Column de grootte aanpassen aan minimale/maximale breedte van kinderen

Wat is Column in Jetpack Compose

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.

Parameters van Column: Arrangement, Alignment, Modifier

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.

kotlin
@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")
    }
}
ArrangementGedrag
Arrangement.TopElementen tegen de bovenkant, vrije ruimte onderaan
Arrangement.CenterElementen in het midden, ruimte gelijk verdeeld boven en onder
Arrangement.SpaceBetweenEerste element boven, laatste onder, rest gelijkmatig
Arrangement.SpaceEvenlyGelijke tussenruimtes tussen alle elementen en randen
Arrangement.SpaceAroundGelijke tussenruimtes tussen elementen, helft aan randen

Column weight: ruimteverdeling tussen elementen

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.

kotlin
@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 vs LazyColumn: wanneer wat te gebruiken

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.

CriteriumColumnLazyColumn
Aantal elementenTot 10-15Elk aantal
PrestatieRendert altijd allesAlleen zichtbare + buffer
ScrollingVia Modifier.verticalScrollIngebouwd
IntrinsicSizeOndersteuntOndersteunt niet
Sticky headersNee (emulatie)Ja (stickyHeader)
ElementanimatieGeen ingebouwdeanimateItemPlacement

Praktische voorbeelden van Column-gebruik

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.

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)
            )
            // 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

Waarin verschilt Column van LazyColumn qua prestaties?

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.

Hoe maak ik Column scrollbaar?

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.

Kan ik Row in Column en Column in Row nesten?

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.

Hoe maak ik alle elementen in Column even breed?

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.

Hoe werkt spacedBy in Column?

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

  • Column — basis verticale Compose-container voor het plaatsen van elementen van boven naar beneden
  • Arrangement beheert de ruimteverdeling (Top, Center, SpaceBetween, spacedBy)
  • Alignment stelt de horizontale uitlijning van elk onderliggend element in
  • Weight verdeelt vrije ruimte proportioneel tussen elementen
  • Column vs LazyColumn: Column voor 3-10 elementen, LazyColumn voor lange lijsten
  • IntrinsicSize laat Column de hoogte aanpassen aan de minimale meting van kinderen
  • Aanbeveling: gebruik spacedBy voor tussenruimtes tussen elementen in plaats van padding op elk

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.

Bespreek het project

Lees ook