Row в Jetpack Compose: какво е, свойства на composable и как работи

Автор: IT Sectr Публикувано: 2026-06-28 Време за четене: 10 мин

Row — е composable функция в Jetpack Compose за поставяне на дъщерни елементи в хоризонтален ред. За разлика от Column, Row подрежда елементите отляво надясно и поддържа настройка на разположението чрез параметрите horizontalArrangement и verticalAlignment. Според Google Android Documentation, 2025, Row е един от трите основни контейнера на Compose заедно с Column и Box и се използва за създаване на хоризонтални интерфейсни структури: редове от бутони, полета за въвеждане и икони с текст.

Основни точки

  • Row — хоризонтален контейнер на Jetpack Compose, който поставя дъщерните елементи в един ред отляво надясно.
  • horizontalArrangement управлява разпределението на елементите хоризонтално: равномерно, с разстояния или в края на контейнера.
  • verticalAlignment подравнява елементите вертикално спрямо контейнера: горен ръб, център или долен ръб.
  • Modifier.weight позволява разпределяне на наличното пространство между елементите на Row пропорционално на указаното тегло.
  • Row е ефективен за създаване на редове от бутони, списъци с икони, полета за въвеждане и хоризонтални ленти с инструменти в мобилни интерфейси.

Какво е Row в Jetpack Compose

Row — е composable функция, която поставя дъщерните елементи в хоризонтална последователност. В йерархията на layout-овете на Compose, Row заема мястото на основен контейнер заедно с Column и Box.

Row не изисква посочване на размери — автоматично се адаптира към съдържанието. Ширината на Row е равна на сумата от ширините на дъщерните елементи, като се вземат предвид разстоянията, освен ако не е зададен Modifier.fillMaxWidth или фиксиран размер.

Дъщерните елементи на Row могат да имат свои собствени модификатори, които влияят на позицията им вътре в контейнера. Например Modifier.weight позволява на елементите да заемат пропорционална част от наличното пространство.

Според Android Developers Blog, 2024, Row обработва дъщерните елементи последователно, изчислявайки размерите им въз основа на правилата за измерване на Compose: първо се измерват елементите без weight, след това останалото пространство се разпределя между елементите с weight.

Синтаксис и основен подпис на Row

Основният подпис на Row включва параметрите modifier, horizontalArrangement и verticalAlignment. Всички дъщерни елементи се предават в последния ламбда блок content.

kotlin
@Composable
fun RowExample() {
    Row(
        modifier = Modifier.fillMaxWidth().padding(16.dp),
        horizontalArrangement = Arrangement.SpaceEvenly,
        verticalAlignment = Alignment.CenterVertically
    ) {
        Text(text = "Едно")
        Text(text = "Две")
        Text(text = "Три")
    }
}

Свойства на Row: horizontalArrangement и verticalAlignment

Параметърът horizontalArrangement определя как дъщерните елементи се разпределят по хоризонталната ос вътре в Row. Налични са стойностите Start, End, Center, SpaceBetween, SpaceAround и SpaceEvenly от класа Arrangement.

Arrangement.Start поставя елементите в началото на контейнера, Arrangement.End — в края, а Arrangement.Center — в центъра. Тези стойности работят подобно на свойството justify-content в CSS Flexbox.

Arrangement.SpaceBetween разпределя елементите равномерно, поставяйки първия в началото, последния в края, а останалите с равни разстояния помежду им. Според Material Design Guidelines, 2025, SpaceBetween е оптимален за ленти с инструменти и навигационни редове.

Параметърът verticalAlignment подравнява елементите вертикално. Налични са Alignment.Top, Alignment.CenterVertically и Alignment.Bottom. Това свойство е полезно, когато елементите на Row имат различна височина — например икона до многоредов текст.

Таблица на стойностите на Arrangement

СтойностОписаниеПриложение
StartЕлементите са притиснати към началото на RowРедове с ляво подравняване
CenterЕлементите в центъра на контейнераХоризонтални менюта, заглавия
SpaceBetweenРавномерно с първи в началото и последен в краяЛенти с инструменти, навигация
SpaceEvenlyРавни разстояния между елементите и ръбоветеРедове от бутони, равномерни мрежи
SpaceAroundРавни разстояния между елементите, половина разстояние по ръбоветеКарусели, галерии с икони

Разпределяне на пространство с Modifier.weight

Modifier.weight — е модификатор, достъпен само вътре в Row и Column, който разпределя наличното пространство между дъщерните елементи пропорционално на указаната стойност. Ако един елемент има тегло 1.0f, а друг 2.0f, вторият елемент ще заеме два пъти повече пространство.

Елементите без weight заемат толкова пространство, колкото им е необходимо за съдържанието им. Останалото пространство се разпределя между елементите с weight пропорционално на тяхното тегло. Това поведение е аналогично на свойството flex-grow в CSS Flexbox.

Според Android Developer Documentation, 2025, weight работи само вътре в Row, Column и BoxWithConstraints. При използване на weight в Row, всички дъщерни елементи се измерват в два прохода: първо елементите без weight, след това елементите с weight.

kotlin
@Composable
fun WeightExample() {
    Row(
        modifier = Modifier.fillMaxWidth(),
        horizontalArrangement = Arrangement.Start
    ) {
        Text(
            text = "Ляво",
            modifier = Modifier.weight(1.0f)
        )
        Text(text = "Дясно")
    }
}

Примери за код с Row

Първият пример показва Row с икона и текст — типичен сценарий за списък с контакти или настройки. Icon и Text са обвити в Row с центриран verticalAlignment.

kotlin
@Composable
fun IconWithText() {
    Row(
        verticalAlignment = Alignment.CenterVertically,
        modifier = Modifier.padding(8.dp)
    ) {
        Icon(
            imageVector = Icons.Default.Favorite,
            contentDescription = "Favorite"
        )
        Spacer(modifier = Modifier.width(8.dp))
        Text(text = "Добави към любими")
    }
}

Вторият пример показва Row с бутони и равномерно разпределение. SpaceEvenly гарантира равни разстояния между всички бутони и ръбовете на контейнера.

kotlin
@Composable
fun ButtonRow() {
    Row(
        modifier = Modifier.fillMaxWidth().padding(16.dp),
        horizontalArrangement = Arrangement.SpaceEvenly
    ) {
        Button(onClick = {}) { Text("Отказ") }
        Button(onClick = {}) { Text("Запази") }
    }
}

Третият пример — Row вътре в Card за показване на рейтинг. Вложеният Row с Modifier.weight позволява на звездата за рейтинг и числовата стойност да заемат фиксирано пространство.

kotlin
@Composable
fun RatingRow(rating: Float) {
    Row(
        verticalAlignment = Alignment.CenterVertically
    ) {
        Text(
            text = "Рейтинг:",
            modifier = Modifier.weight(1.0f)
        )
        Text(text = "$rating / 5.0")
    }
}

Особености на Row в адаптивния layout

Row изисква контрол на ширината в адаптивния layout. Ако съдържанието на Row надвишава наличната ширина на екрана, елементите могат да излязат извън границите на контейнера. За да предотвратите това, използвайте Modifier.horizontalScroll или преминете към Column.

При комбиниране на Row с Modifier.weight е важно да зададете fillMaxWidth за родителския Row — в противен случай weight ще разпределя несъществуващо пространство. Според Material Design Guidelines, 2025, Row с weight без fillMaxWidth се счита за неправилна конфигурация.

За адаптивни интерфейси се препоръчва комбиниране на Row с Box или използване на Arrangement.SpaceBetween за автоматично разпределяне на елементите при различни размери на екрана. Това осигурява гъвкавост без медийни заявки.

  • Modifier.horizontalScroll — добавя превъртане при препълване на Row
  • Modifier.weight — разпределя пространството пропорционално
  • Arrangement.SpaceBetween — адаптивно разпределение с фиксиране по ръбовете

Често задавани въпроси

По какво Row се различава от Column в Jetpack Compose?

Row поставя елементите хоризонтално (отляво надясно), докато Column — вертикално (отгоре надолу). Row замества LinearLayout с хоризонтална ориентация от стария View подход, а Column — вертикалния LinearLayout.

Как да направите Row с превъртане?

Добавете модификатора Modifier.horizontalScroll към Row. За големи списъци с лениво зареждане използвайте LazyRow — той визуализира само видимите елементи и ги преизползва при превъртане.

Може ли Row да бъде вложен в друг Row?

Да, Row може да бъде вложен в друг Row, Column или Box. При влагане имайте предвид, че вътрешният Row получава ширина от родителския контейнер и при необходимост задайте fillMaxWidth за всяко ниво.

Какво прави Modifier.weight в Row?

Modifier.weight разпределя останалото пространство в Row между дъщерните елементи пропорционално на указаното тегло. Елемент с тегло 2.0f ще бъде два пъти по-широк от елемент с тегло 1.0f. Weight работи само вътре в Row и Column.

Как да центрирате елементите на Row вертикално?

Използвайте параметъра verticalAlignment = Alignment.CenterVertically при създаване на Row. Това ще подравни всички дъщерни елементи по вертикалната ос, независимо от тяхната височина.

Резюме

  • Row — хоризонтален контейнер на Compose за поставяне на елементи в ред отляво надясно с конфигурируемо разположение и подравняване.
  • horizontalArrangement управлява хоризонталното разпределение на елементите: Start, Center, End, SpaceBetween, SpaceEvenly и SpaceAround.
  • verticalAlignment подравнява елементите вертикално чрез Alignment.Top, CenterVertically или Bottom.
  • Modifier.weight разпределя свободното пространство между елементите пропорционално на указаното тегло, аналогично на flex-grow в CSS.
  • Row поддържа влагане, превъртане чрез Modifier.horizontalScroll и работа с други контейнери на Compose.
  • В адаптивния layout е важно да зададете Modifier.fillMaxWidth за Row с weight, в противен случай елементите няма да разпределят правилно пространството.
  • За хоризонтални списъци с много елементи използвайте LazyRow вместо Row за оптимална производителност.

Ще разработим мобилно приложение под ключ

IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.

Обсъдете проекта

Прочетете също