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-функция, которая располагает дочерние элементы в горизонтальной последовательности. В иерархии макетов 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 = "One")
        Text(text = "Two")
        Text(text = "Three")
    }
}

Свойства 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 = "Left",
            modifier = Modifier.weight(1.0f)
        )
        Text(text = "Right")
    }
}

Примеры кода с 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 = "Add to favorites")
    }
}

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

kotlin
@Composable
fun ButtonRow() {
    Row(
        modifier = Modifier.fillMaxWidth().padding(16.dp),
        horizontalArrangement = Arrangement.SpaceEvenly
    ) {
        Button(onClick = {}) { Text("Cancel") }
        Button(onClick = {}) { Text("Save") }
    }
}

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

kotlin
@Composable
fun RatingRow(rating: Float) {
    Row(
        verticalAlignment = Alignment.CenterVertically
    ) {
        Text(
            text = "Rating:",
            modifier = Modifier.weight(1.0f)
        )
        Text(text = "$rating / 5.0")
    }
}

Особенности Row при адаптивной вёрстке

Row требует контроля ширины при адаптивной вёрстке. Если содержимое 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 между дочерними элементами пропорционально указанному весу. Элемент с weight 2.0f станет вдвое шире элемента с weight 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.
  • При адаптивной вёрстке важно задавать Modifier.fillMaxWidth для Row с weight, иначе элементы не распределят пространство корректно.
  • Для горизонтальных списков с большим количеством элементов используйте LazyRow вместо Row для оптимальной производительности.

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

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

Читайте также