Column: vertikal placering och konfigurering av behållaren i Compose

Författare: IT Sectr Publicerad: 2026-06-28 Lästid: 8 min

Column — är en inbyggd Composable-komponent i Jetpack Compose från paketet compose.foundation.layout som placerar underordnade element vertikalt, ett under det andra. Column är en analog till LinearLayout med vertikal orientering från det gamla View-systemet, men till skillnad från det använder den deklarativ beskrivning och reagerar automatiskt på tillståndsändringar. Enligt Google Android Developers, 2026 är Column en av tre grundläggande behållare tillsammans med Row och Box.

Huvudpunkter

  • Column placerar element vertikalt med inställning av Arrangement och Alignment
  • Arrangement bestämmer fördelningen av utrymme mellan element vertikalt
  • Alignment anger horisontell justering av varje element inuti Column
  • Vikt (weight) fördelar ledigt utrymme proportionellt mellan element
  • IntrinsicSize låter Column anpassa storleken till minimal/maximal bredd hos underordnade

Vad är Column i Jetpack Compose

Column — är en Composable-funktion som accepterar valfria parametrar: modifier, verticalArrangement, horizontalAlignment och content — en lambda med ColumnScope. Inuti Column placeras underordnade Composable-funktioner uppifrån och ned i deklarationsordning. Columnens höjd är lika med summan av höjderna på underordnade element plus utrymmet som anges av Arrangement. Bredd — enligt maximal bredd på det underordnade elementet med hänsyn till Alignment.

Column är en osynlig behållare: den har ingen egen bakgrund eller kant som standard. Om bakgrund behövs — lägg till Modifier.background() till själva Column. Till skillnad från LazyColumn visar Column alla underordnade element samtidigt och stöder inte virtualisering. Detta innebär att Column endast är lämplig för små datamängder — upp till 10-15 element. För långa listor använder du LazyColumn.

ColumnScope — är en receiver för Column content-lambda. Den tillhandahåller ytterligare modifierare som bara fungerar inuti Column: weight(), align(), alignByBaseline(). Dessa modifierare är meningslösa utanför Column eftersom de förlitar sig på det vertikala arrangemangets specificitet. Till exempel, Modifier.align(Alignment.CenterHorizontally) justerar det underordnade elementet horisontellt till mitten av Column.

Parametrar för Column: Arrangement, Alignment, Modifier

VerticalArrangement bestämmer hur det vertikala utrymmet fördelas mellan element. Tillgängliga värden: Arrangement.Top (standard), Bottom, Center, SpaceBetween, SpaceEvenly, SpaceAround. Om Columnens höjd är större än summan av elementens höjder fördelar Arrangement det lediga utrymmet. Om elementen upptar hela höjden — påverkar Arrangement inte.

HorizontalAlignment anger horisontell justering av varje underordnat element. Alignment.Start (standard, LTR), CenterHorizontally, End. Alignment verkar på varje element oberoende: om ett element är smalt och ett annat brett — kommer det första att justeras, det andra kan överskrida Columnens gränser. Alignment fungerar bara om Column har fast bredd eller fillMaxWidth.

Modifier för Column: Column accepterar en Modifier som tillämpas på själva behållaren. Modifier.fillMaxWidth(), fillMaxHeight(), size(), padding() — alla standardmodifierare fungerar. Egenskap: Modifier.height(IntrinsicSize.Min) tvingar Column att beräkna minimal höjd baserat på underordnade element med hänsyn till Intrinsic measurement.

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

    // IntrinsicSize: Column anpassar höjd till innehåll
@Composable
fun IntrinsicColumn() {
    Column(
        modifier = Modifier
            .height(IntrinsicSize.Min)
            .width(200.dp)
    ) {
        Text("Kort text")
        Text("En mycket lång text som kommer att lindas inuti kolumnen")
    }
}
ArrangementBeteende
Arrangement.TopElement tryckta mot toppen, ledigt utrymme i botten
Arrangement.CenterElement i mitten, utrymme delat lika upptill och nedtill
Arrangement.SpaceBetweenFörsta elementet högst upp, sista längst ner, resten jämnt
Arrangement.SpaceEvenlyLika mellanrum mellan alla element och kanter
Arrangement.SpaceAroundLika mellanrum mellan element, hälften vid kanterna

Column weight: fördelning av utrymme mellan element

Modifier.weight() — är en ColumnScope-modifierare som fördelar ledigt vertikalt utrymme mellan Column-element proportionellt enligt angivna vikter. Om Column upptar 400dp höjd och underordnade element totalt 100dp, delas de återstående 300dp mellan weight-element. Ett element med weight(2f) får dubbelt så mycket utrymme som ett element med weight(1f).

fill — den andra parametern för weight: weight(weight: Float, fill: Boolean = true). Om fill = true (standard) sträcks elementet över hela tillgängliga höjden. Om fill = false — upptar elementet bara sin intrinsiska höjd, resterande utrymme förblir tomt. Detta är användbart när elementet ska tryckas mot en sida, men weight bara anger proportionen för fördelning av tomt utrymme.

Begränsningar för weight: weight fungerar bara i Column med fast höjd eller fillMaxHeight(). Om Columnens höjd bestäms av underordnade element (wrap content) har vikter ingen mening — det finns inget ledigt utrymme att fördela. Weight kan inte heller kombineras med Modifier.height() på samma element — de är i konflikt och weight ignoreras.

kotlin
@Composable
fun WeightedColumn() {
    Column(
        modifier = Modifier.fillMaxHeight().width(300.dp)
    ) {
        // Tar 1/6 av höjden (vikt 1 av summa 1+2+3=6)
        Box(
            modifier = Modifier
                .weight(1f)
                .fillMaxWidth()
                .background(Color.Red)
        )
        // Tar 2/6 av höjden
        Box(
            modifier = Modifier
                .weight(2f)
                .fillMaxWidth()
                .background(Color.Green)
        )
        // Tar 3/6 av höjden
        Box(
            modifier = Modifier
                .weight(3f)
                .fillMaxWidth()
                .background(Color.Blue)
        )
    }
}

Column vs LazyColumn: när ska man använda vad

Column visar alla underordnade element omedelbart. Om det finns fler än 10-15 element skapar Column en betydande belastning på komposition och mätning. LazyColumn å andra sidan renderar bara synliga element och återanvänder osynliga. För långa listor, listor med tusentals element, oändliga listor eller chattar — är LazyColumn obligatorisk.

När Column är bättre: skärmar med formulär (3-10 fält), profil kort, vertikala kolumner med ikoner, menyer. Column stöder också IntrinsicSize, vilket är användbart för adaptiv höjd. Dessutom är Column lättare att felsöka — ingen virtualisering, alla element är synliga i Layout Inspector. För statiskt UI är Column rätt val.

LazyColumn ger: item caching, nyckelbaserad identitet, animering av tillägg/borttagning (animateItemPlacement), sticky headers. Om listan innehåller element av olika typer (olika viewType) — använd LazyColumn med sealed class i items. Column stöder inte sticky headers (de måste emuleras via scrollable Column). LazyColumn stöder också LazyVerticalGrid när GridCells används.

KriteriumColumnLazyColumn
Antal elementUpp till 10-15Valfritt
PrestandaRenderar alltid allaEndast synliga + buffer
ScrollingVia Modifier.verticalScrollInbyggd
IntrinsicSizeStöderStöder inte
Sticky headersNej (emulering)Ja (stickyHeader)
ElementanimeringIngen inbyggdanimateItemPlacement

Praktiska exempel på användning av Column

Låt oss titta på skärmen användarprofil, där Column används som huvudbehållare för avatar, namn, bio och åtgärdsknappar. Här anpassar Column med IntrinsicSize.Min sig till innehållet, och weight används för att fördela utrymme mellan sektioner.

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)
            )
            // Namn
            Text(name, style = MaterialTheme.typography.headlineSmall)
            // Bio
            Text(bio, style = MaterialTheme.typography.bodyMedium,
                modifier = Modifier.padding(top = 4.dp))
            // Åtgärdsknappar
            Row(
                horizontalArrangement = Arrangement.spacedBy(12.dp),
                modifier = Modifier.padding(top = 12.dp)
            ) {
                Button(onClick = { }) { Text("Meddelande") }
                OutlinedButton(onClick = { }) { Text("Följ") }
            }
        }
    }
}

I exemplet använder Column Arrangement.spacedBy(8.dp) för jämna mellanrum mellan element. horizontalAlignment = CenterHorizontally centrerar avatar, namn och bio. Row inuti Column — en nästlad behållare för knappar i en rad. En sådan kombination av Column (vertikal placering) och Row (horisontell placering) är ett typiskt mönster för UI-bygge i Compose.

Vanliga frågor

Vad skiljer Column från LazyColumn när det gäller prestanda?

Column renderar alla underordnade element omedelbart, vilket vid 100+ element orsakar FPS-fall. LazyColumn renderar bara synliga element + buffer (vanligtvis 3-5 skärmar). För statiska skärmar med 3-10 element är Column snabbare eftersom det inte finns någon virtualiseringsoverhead.

Hur gör man Column rullbar?

Lägg till Modifier.verticalScroll(rememberScrollState()) till Column. Detta gör Column rullbar, men ger inte virtualisering — alla element renderas fortfarande omedelbart. För långa rullbara listor använder du LazyColumn.

Kan man nästla Row i Column och Column i Row?

Ja, nästling av Row/Column är normal praxis. Genom att kombinera två behållare kan man bygga komplexa rutnät. Undvik dock djup nästling (4+ nivåer) utan behov — det ökar antalet LayoutNode-mätningar och saktar ner kompositionen.

Hur gör man alla element i Column lika breda?

Använd Modifier.fillMaxWidth() på varje underordnat element. Om Column har Modifier.fillMaxWidth() sträcks alla underordnade med fillMaxWidth() över hela bredden. Alternativ: Modifier.weight(1f) i ColumnScope om Column befinner sig i en fast behållare.

Hur fungerar spacedBy i Column?

Arrangement.spacedBy(space) lägger till ett fast mellanrum mellan varje två angränsande element. Till skillnad från SpaceBetween/SpaceAround sträcker spacedBy inte element — mellanrummet är fast och resterande utrymme förblir i slutet av Column. spacedBy lägger inte till mellanrum före det första och efter det sista elementet.

Sammanfattning

  • Column — grundläggande vertikal Compose-behållare för att placera element uppifrån och ned
  • Arrangement hanterar utrymmesfördelning (Top, Center, SpaceBetween, spacedBy)
  • Alignment anger horisontell justering av varje underordnat element
  • Weight fördelar ledigt utrymme proportionellt mellan element
  • Column vs LazyColumn: Column för 3-10 element, LazyColumn för långa listor
  • IntrinsicSize låter Column anpassa höjden till minimal storlek på underordnade
  • Rekommendation: använd spacedBy för mellanrum mellan element istället för padding på varje

Vi utvecklar en mobil applikation nyckelfärdigt

IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.

Diskutera projektet

Läs också