Row — це composable-функція в Jetpack Compose для розміщення дочірніх елементів у горизонтальному рядку. На відміну від Column, Row вибудовує елементи зліва направо та підтримує налаштування розташування через параметри horizontalArrangement та verticalAlignment. За даними Google Android Documentation, 2025, Row є одним із трьох базових контейнерів Compose поряд із Column та Box і використовується для створення горизонтальних структур інтерфейсу: рядків кнопок, полів введення та іконок із текстом.
Головне
Row — це composable-функція, яка розміщує дочірні елементи в горизонтальній послідовності. В ієрархії макетів 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 вимагає контролю ширини при адаптивній верстці. Якщо вміст 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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також