Row — е composable функция в Jetpack Compose за поставяне на дъщерни елементи в хоризонтален ред. За разлика от Column, Row подрежда елементите отляво надясно и поддържа настройка на разположението чрез параметрите horizontalArrangement и verticalAlignment. Според Google Android Documentation, 2025, Row е един от трите основни контейнера на Compose заедно с Column и Box и се използва за създаване на хоризонтални интерфейсни структури: редове от бутони, полета за въвеждане и икони с текст.
Основни точки
Row — е composable функция, която поставя дъщерните елементи в хоризонтална последователност. В йерархията на layout-овете на Compose, Row заема мястото на основен контейнер заедно с Column и Box.
Row не изисква посочване на размери — автоматично се адаптира към съдържанието. Ширината на Row е равна на сумата от ширините на дъщерните елементи, като се вземат предвид разстоянията, освен ако не е зададен Modifier.fillMaxWidth или фиксиран размер.
Дъщерните елементи на Row могат да имат свои собствени модификатори, които влияят на позицията им вътре в контейнера. Например Modifier.weight позволява на елементите да заемат пропорционална част от наличното пространство.
Според Android Developers Blog, 2024, Row обработва дъщерните елементи последователно, изчислявайки размерите им въз основа на правилата за измерване на Compose: първо се измерват елементите без weight, след това останалото пространство се разпределя между елементите с weight.
Основният подпис на Row включва параметрите modifier, horizontalArrangement и verticalAlignment. Всички дъщерни елементи се предават в последния ламбда блок content.
@Composable
fun RowExample() {
Row(
modifier = Modifier.fillMaxWidth().padding(16.dp),
horizontalArrangement = Arrangement.SpaceEvenly,
verticalAlignment = Alignment.CenterVertically
) {
Text(text = "Едно")
Text(text = "Две")
Text(text = "Три")
}
}
Параметърът 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 имат различна височина — например икона до многоредов текст.
| Стойност | Описание | Приложение |
|---|---|---|
| Start | Елементите са притиснати към началото на Row | Редове с ляво подравняване |
| Center | Елементите в центъра на контейнера | Хоризонтални менюта, заглавия |
| SpaceBetween | Равномерно с първи в началото и последен в края | Ленти с инструменти, навигация |
| SpaceEvenly | Равни разстояния между елементите и ръбовете | Редове от бутони, равномерни мрежи |
| SpaceAround | Равни разстояния между елементите, половина разстояние по ръбовете | Карусели, галерии с икони |
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.
@Composable
fun WeightExample() {
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.Start
) {
Text(
text = "Ляво",
modifier = Modifier.weight(1.0f)
)
Text(text = "Дясно")
}
}
Първият пример показва Row с икона и текст — типичен сценарий за списък с контакти или настройки. Icon и Text са обвити в Row с центриран verticalAlignment.
@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 гарантира равни разстояния между всички бутони и ръбовете на контейнера.
@Composable
fun ButtonRow() {
Row(
modifier = Modifier.fillMaxWidth().padding(16.dp),
horizontalArrangement = Arrangement.SpaceEvenly
) {
Button(onClick = {}) { Text("Отказ") }
Button(onClick = {}) { Text("Запази") }
}
}
Третият пример — Row вътре в Card за показване на рейтинг. Вложеният Row с Modifier.weight позволява на звездата за рейтинг и числовата стойност да заемат фиксирано пространство.
@Composable
fun RatingRow(rating: Float) {
Row(
verticalAlignment = Alignment.CenterVertically
) {
Text(
text = "Рейтинг:",
modifier = Modifier.weight(1.0f)
)
Text(text = "$rating / 5.0")
}
}
Row изисква контрол на ширината в адаптивния layout. Ако съдържанието на Row надвишава наличната ширина на екрана, елементите могат да излязат извън границите на контейнера. За да предотвратите това, използвайте Modifier.horizontalScroll или преминете към Column.
При комбиниране на Row с Modifier.weight е важно да зададете fillMaxWidth за родителския Row — в противен случай weight ще разпределя несъществуващо пространство. Според Material Design Guidelines, 2025, Row с weight без fillMaxWidth се счита за неправилна конфигурация.
За адаптивни интерфейси се препоръчва комбиниране на Row с Box или използване на Arrangement.SpaceBetween за автоматично разпределяне на елементите при различни размери на екрана. Това осигурява гъвкавост без медийни заявки.
Често задавани въпроси
Row поставя елементите хоризонтално (отляво надясно), докато Column — вертикално (отгоре надолу). Row замества LinearLayout с хоризонтална ориентация от стария View подход, а Column — вертикалния LinearLayout.
Добавете модификатора Modifier.horizontalScroll към Row. За големи списъци с лениво зареждане използвайте LazyRow — той визуализира само видимите елементи и ги преизползва при превъртане.
Да, Row може да бъде вложен в друг Row, Column или Box. При влагане имайте предвид, че вътрешният Row получава ширина от родителския контейнер и при необходимост задайте fillMaxWidth за всяко ниво.
Modifier.weight разпределя останалото пространство в Row между дъщерните елементи пропорционално на указаното тегло. Елемент с тегло 2.0f ще бъде два пъти по-широк от елемент с тегло 1.0f. Weight работи само вътре в Row и Column.
Използвайте параметъра verticalAlignment = Alignment.CenterVertically при създаване на Row. Това ще подравни всички дъщерни елементи по вертикалната ос, независимо от тяхната височина.
Резюме
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също