Column: κάθετη διάταξη και διαμόρφωση του container στο Compose

Συγγραφέας: IT Sectr Δημοσιεύτηκε: 2026-06-28 Χρόνος ανάγνωσης: 8 λεπ

Column — είναι ένα ενσωματωμένο Composable στοιχείο του Jetpack Compose από το πακέτο compose.foundation.layout, το οποίο τοποθετεί τα θυγατρικά στοιχεία κάθετα, το ένα κάτω από το άλλο. Το Column είναι το ανάλογο του LinearLayout με κάθετο προσανατολισμό από το παλιό σύστημα View, αλλά σε αντίθεση με αυτό χρησιμοποιεί δηλωτική περιγραφή και αντιδρά αυτόματα σε αλλαγές κατάστασης. Σύμφωνα με Google Android Developers, 2026, το Column είναι ένα από τα τρία βασικά containers μαζί με τα Row και Box.

Κύρια σημεία

  • Column τοποθετεί τα στοιχεία κάθετα με ρύθμιση Arrangement και Alignment
  • Arrangement καθορίζει την κατανομή του χώρου μεταξύ των στοιχείων κάθετα
  • Alignment ορίζει την οριζόντια στοίχιση κάθε στοιχείου μέσα στο Column
  • Βάρος (weight) κατανέμει τον ελεύθερο χώρο αναλογικά μεταξύ των στοιχείων
  • IntrinsicSize επιτρέπει στο Column να προσαρμόζει το μέγεθος στο ελάχιστο/μέγιστο πλάτος των θυγατρικών

Τι είναι το Column στο Jetpack Compose

Column — είναι μια Composable συνάρτηση που δέχεται προαιρετικές παραμέτρους: modifier, verticalArrangement, horizontalAlignment και content — μια lambda με ColumnScope. Μέσα στο Column, οι θυγατρικές Composable συναρτήσεις τοποθετούνται από πάνω προς τα κάτω με τη σειρά δήλωσης. Το ύψος του Column ισούται με το άθροισμα των υψών των θυγατρικών στοιχείων συν τον χώρο που καθορίζεται από το Arrangement. Το πλάτος — σύμφωνα με το μέγιστο πλάτος του θυγατρικού στοιχείου λαμβάνοντας υπόψη το Alignment.

Το Column είναι ένα αόρατο container: δεν έχει δικό του φόντο ή περίγραμμα από προεπιλογή. Αν χρειάζεται φόντο — προσθέστε Modifier.background() στο ίδιο το Column. Σε αντίθεση με το LazyColumn, το Column εμφανίζει όλα τα θυγατρικά στοιχεία ταυτόχρονα και δεν υποστηρίζει εικονικοποίηση. Αυτό σημαίνει ότι το Column είναι κατάλληλο μόνο για μικρά σύνολα δεδομένων — έως 10-15 στοιχεία. Για μεγάλες λίστες χρησιμοποιήστε το LazyColumn.

ColumnScope — είναι ένα receiver για το lambda content του Column. Παρέχει πρόσθετους modifiers που λειτουργούν μόνο μέσα στο Column: weight(), align(), alignByBaseline(). Αυτοί οι modifiers δεν έχουν νόημα εκτός του Column, καθώς βασίζονται στην ιδιαιτερότητα της κάθετης διάταξης. Για παράδειγμα, το Modifier.align(Alignment.CenterHorizontally) στοιχίζει το θυγατρικό στοιχείο στο κέντρο του Column οριζόντια.

Παράμετροι Column: Arrangement, Alignment, Modifier

VerticalArrangement καθορίζει πώς κατανέμεται ο κάθετος χώρος μεταξύ των στοιχείων. Διαθέσιμες τιμές: Arrangement.Top (προεπιλογή), Bottom, Center, SpaceBetween, SpaceEvenly, SpaceAround. Αν το ύψος του Column είναι μεγαλύτερο από το άθροισμα των υψών των στοιχείων, το Arrangement κατανέμει τον ελεύθερο χώρο. Αν τα στοιχεία καταλαμβάνουν όλο το ύψος — το Arrangement δεν έχει επίδραση.

HorizontalAlignment ορίζει την οριζόντια στοίχιση κάθε θυγατρικού στοιχείου. Alignment.Start (προεπιλογή, LTR), CenterHorizontally, End. Το Alignment δρα σε κάθε στοιχείο ανεξάρτητα: αν ένα στοιχείο είναι στενό και ένα άλλο φαρδύ — το πρώτο θα στοιχιστεί, το δεύτερο μπορεί να βγει εκτός των ορίων του Column. Το Alignment λειτουργεί μόνο αν το Column έχει σταθερό πλάτος ή fillMaxWidth.

Modifier για το Column: Το Column δέχεται ένα Modifier που εφαρμόζεται στο ίδιο το container. Modifier.fillMaxWidth(), fillMaxHeight(), size(), padding() — όλοι οι τυπικοί modifiers λειτουργούν. Ιδιαιτερότητα: το Modifier.height(IntrinsicSize.Min) αναγκάζει το Column να υπολογίσει το ελάχιστο ύψος βάσει των θυγατρικών στοιχείων λαμβάνοντας υπόψη την Intrinsic measurement.

kotlin
@Composable
fun ColumnArrangementDemo() {
    Column(
        modifier = Modifier.fillMaxSize().background(Color(0xFFF5F5F5)),
        verticalArrangement = Arrangement.SpaceEvenly,
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
        Text("Πάνω", modifier = Modifier.background(Color.Cyan))
        Text("Μέση", modifier = Modifier.background(Color.Magenta))
        Text("Κάτω", modifier = Modifier.background(Color.Yellow))
    }
}

    // IntrinsicSize: Column προσαρμόζει το ύψος στο περιεχόμενο
@Composable
fun IntrinsicColumn() {
    Column(
        modifier = Modifier
            .height(IntrinsicSize.Min)
            .width(200.dp)
    ) {
        Text("Σύντομο κείμενο")
        Text("Ένα πολύ μακρύ κείμενο που θα τυλιχθεί μέσα στη στήλη")
    }
}
ArrangementΣυμπεριφορά
Arrangement.TopΣτοιχεία κολλημένα στην κορυφή, ελεύθερος χώρος κάτω
Arrangement.CenterΣτοιχεία στο κέντρο, χώρος μοιρασμένος ίσα πάνω και κάτω
Arrangement.SpaceBetweenΠρώτο στοιχείο πάνω, τελευταίο κάτω, τα υπόλοιπα ομοιόμορφα
Arrangement.SpaceEvenlyΊσα διαστήματα μεταξύ όλων των στοιχείων και των άκρων
Arrangement.SpaceAroundΊσα διαστήματα μεταξύ στοιχείων, μισά στις άκρες

Column weight: κατανομή χώρου μεταξύ στοιχείων

Modifier.weight() — είναι ένας ColumnScope modifier που κατανέμει τον ελεύθερο κάθετο χώρο μεταξύ των στοιχείων του Column αναλογικά σύμφωνα με τα καθορισμένα βάρη. Αν το Column καταλαμβάνει ύψος 400dp και τα θυγατρικά στοιχεία συνολικά 100dp, τότε τα υπόλοιπα 300dp μοιράζονται μεταξύ των weight στοιχείων. Ένα στοιχείο με weight(2f) θα λάβει διπλάσιο χώρο από ένα στοιχείο με weight(1f).

fill — η δεύτερη παράμετρος του weight: weight(weight: Float, fill: Boolean = true). Αν fill = true (προεπιλογή), το στοιχείο τεντώνεται σε όλο το διαθέσιμο ύψος. Αν fill = false — το στοιχείο καταλαμβάνει μόνο το intrinsic ύψος του, ο υπόλοιπος χώρος παραμένει κενός. Αυτό είναι χρήσιμο όταν το στοιχείο πρέπει να είναι κολλημένο στη μία πλευρά, αλλά το weight καθορίζει μόνο την αναλογία κατανομής του κενού χώρου.

Περιορισμοί του weight: το weight λειτουργεί μόνο σε Column με σταθερό ύψος ή fillMaxHeight(). Αν το ύψος του Column καθορίζεται από τα θυγατρικά στοιχεία (wrap content), τα βάρη δεν έχουν νόημα — δεν υπάρχει ελεύθερος χώρος για κατανομή. Επίσης, το weight δεν μπορεί να συνδυαστεί με Modifier.height() στο ίδιο στοιχείο — έρχονται σε αντίφαση και το weight αγνοείται.

kotlin
@Composable
fun WeightedColumn() {
    Column(
        modifier = Modifier.fillMaxHeight().width(300.dp)
    ) {
        // Καταλαμβάνει το 1/6 του ύψους (βάρος 1 από άθροισμα 1+2+3=6)
        Box(
            modifier = Modifier
                .weight(1f)
                .fillMaxWidth()
                .background(Color.Red)
        )
        // Καταλαμβάνει το 2/6 του ύψους
        Box(
            modifier = Modifier
                .weight(2f)
                .fillMaxWidth()
                .background(Color.Green)
        )
        // Καταλαμβάνει το 3/6 του ύψους
        Box(
            modifier = Modifier
                .weight(3f)
                .fillMaxWidth()
                .background(Color.Blue)
        )
    }
}

Column vs LazyColumn: πότε να χρησιμοποιείτε τι

Column εμφανίζει όλα τα θυγατρικά στοιχεία αμέσως. Αν υπάρχουν περισσότερα από 10-15 στοιχεία, το Column δημιουργεί σημαντικό φορτίο στη σύνθεση και τη μέτρηση. Το LazyColumn, αντίθετα, κάνει render μόνο τα ορατά στοιχεία και επαναχρησιμοποιεί τα αόρατα. Για μεγάλες λίστες, λίστες με χιλιάδες στοιχεία, ατελείωτες λίστες ή συνομιλίες — το LazyColumn είναι υποχρεωτικό.

Πότε το Column είναι καλύτερο: οθόνες με φόρμες (3-10 πεδία), κάρτες προφίλ, κάθετες στήλες με εικονίδια, μενού. Το Column υποστηρίζει επίσης το IntrinsicSize, που είναι χρήσιμο για προσαρμοστικό ύψος. Επιπλέον, το Column είναι πιο εύκολο στον εντοπισμό σφαλμάτων — δεν υπάρχει εικονικοποίηση, όλα τα στοιχεία είναι ορατά στο Layout Inspector. Για στατικό UI, το Column είναι η σωστή επιλογή.

Το LazyColumn παρέχει: item caching, αναγνώριση βάσει κλειδιού, κινούμενα γραφικά προσθήκης/αφαίρεσης (animateItemPlacement), sticky headers. Αν η λίστα περιέχει στοιχεία διαφορετικών τύπων (διαφορετικό viewType) — χρησιμοποιήστε LazyColumn με sealed class στα items. Το Column δεν υποστηρίζει sticky headers (πρέπει να εξομοιωθούν μέσω scrollable Column). Το LazyColumn υποστηρίζει επίσης το LazyVerticalGrid όταν χρησιμοποιείται GridCells.

ΚριτήριοColumnLazyColumn
Αριθμός στοιχείωνΈως 10-15Οποιοσδήποτε
ΑπόδοσηΠάντα κάνει render όλαΜόνο ορατά + buffer
ScrollingΜέσω Modifier.verticalScrollΕνσωματωμένο
IntrinsicSizeΥποστηρίζειΔεν υποστηρίζει
Sticky headersΌχι (εξομοίωση)Ναι (stickyHeader)
Κινούμενα γραφικά στοιχείωνΧωρίς ενσωματωμέναanimateItemPlacement

Πρακτικά παραδείγματα χρήσης του Column

Ας εξετάσουμε την οθόνη προφίλ χρήστη, όπου το Column χρησιμοποιείται ως κύριο container για το avatar, όνομα, βιογραφικό και κουμπιά ενεργειών. Εδώ το Column με IntrinsicSize.Min προσαρμόζεται στο περιεχόμενο, και το weight εφαρμόζεται για την κατανομή χώρου μεταξύ των τμημάτων.

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)
            )
            // Όνομα
            Text(name, style = MaterialTheme.typography.headlineSmall)
            // Βιογραφικό
            Text(bio, style = MaterialTheme.typography.bodyMedium,
                modifier = Modifier.padding(top = 4.dp))
            // Κουμπιά ενεργειών
            Row(
                horizontalArrangement = Arrangement.spacedBy(12.dp),
                modifier = Modifier.padding(top = 12.dp)
            ) {
                Button(onClick = { }) { Text("Μήνυμα") }
                OutlinedButton(onClick = { }) { Text("Ακολουθώ") }
            }
        }
    }
}

Στο παράδειγμα, το Column χρησιμοποιεί Arrangement.spacedBy(8.dp) για ομοιόμορφα διαστήματα μεταξύ των στοιχείων. horizontalAlignment = CenterHorizontally στοιχίζει το avatar, το όνομα και το βιογραφικό στο κέντρο. Το Row μέσα στο Column — ένα ένθετο container για τα κουμπιά σε μία γραμμή. Αυτός ο συνδυασμός Column (κάθετη διάταξη) και Row (οριζόντια διάταξη) είναι ένα τυπικό μοτίβο κατασκευής UI στο Compose.

Συχνές Ερωτήσεις

Σε τι διαφέρει το Column από το LazyColumn όσον αφορά την απόδοση;

Column κάνει render όλα τα θυγατρικά στοιχεία αμέσως, που με 100+ στοιχεία προκαλεί πτώση FPS. Το LazyColumn κάνει render μόνο τα ορατά στοιχεία + buffer (συνήθως 3-5 οθόνες). Για στατικές οθόνες με 3-10 στοιχεία, το Column είναι ταχύτερο, καθώς δεν έχει επιβάρυνση εικονικοποίησης.

Πώς να κάνω το Column κυλιόμενο;

Προσθέστε Modifier.verticalScroll(rememberScrollState()) στο Column. Αυτό κάνει το Column κυλιόμενο, αλλά δεν παρέχει εικονικοποίηση — όλα τα στοιχεία εξακολουθούν να γίνονται render αμέσως. Για μεγάλες κυλιόμενες λίστες χρησιμοποιήστε LazyColumn.

Μπορεί να τοποθετηθεί Row μέσα σε Column και Column μέσα σε Row;

Ναι, η ένθεση Row/Column είναι φυσιολογική πρακτική. Συνδυάζοντας δύο containers, μπορούν να κατασκευαστούν πολύπλοκα πλέγματα. Ωστόσο, αποφύγετε τη βαθιά ένθεση (4+ επίπεδα) χωρίς ανάγκη — αυξάνει τον αριθμό μετρήσεων LayoutNode και επιβραδύνει τη σύνθεση.

Πώς να κάνω όλα τα στοιχεία στο Column να έχουν το ίδιο πλάτος;

Χρησιμοποιήστε Modifier.fillMaxWidth() σε κάθε θυγατρικό στοιχείο. Αν το Column έχει Modifier.fillMaxWidth(), όλα τα θυγατρικά με fillMaxWidth() θα τεντωθούν σε όλο το πλάτος. Εναλλακτικά: Modifier.weight(1f) στο ColumnScope, αν το Column βρίσκεται σε σταθερό container.

Πώς λειτουργεί το spacedBy στο Column;

Arrangement.spacedBy(space) προσθέτει σταθερό διάστημα μεταξύ κάθε δύο γειτονικών στοιχείων. Σε αντίθεση με SpaceBetween/SpaceAround, το spacedBy δεν τεντώνει τα στοιχεία — το διάστημα είναι σταθερό και ο υπόλοιπος χώρος παραμένει στο τέλος του Column. Το spacedBy δεν προσθέτει διάστημα πριν από το πρώτο στοιχείο και μετά από το τελευταίο στοιχείο.

Σύνοψη

  • Column — βασικός κάθετος container του Compose για τοποθέτηση στοιχείων από πάνω προς τα κάτω
  • Arrangement διαχειρίζεται την κατανομή χώρου (Top, Center, SpaceBetween, spacedBy)
  • Alignment ορίζει την οριζόντια στοίχιση κάθε θυγατρικού στοιχείου
  • Weight κατανέμει τον ελεύθερο χώρο αναλογικά μεταξύ των στοιχείων
  • Column vs LazyColumn: Column για 3-10 στοιχεία, LazyColumn για μεγάλες λίστες
  • IntrinsicSize επιτρέπει στο Column να προσαρμόζει το ύψος στο ελάχιστο μέγεθος των θυγατρικών
  • Σύσταση: χρησιμοποιήστε spacedBy για διαστήματα μεταξύ στοιχείων αντί για padding σε κάθε ένα

Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση

Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

Συζήτηση έργου

Διαβάστε επίσης