Прямые ссылки на публичные уроки для быстрого старта и стабильной индексации lesson-страниц.
XML – это язык разметки, который среди прочего позволяет задать вложенность элементов относительно друг друга. Атрибуты определяют свойства и характеристики элементов разметки. Элементами являются View. Интерфейс в Android приложениях – это набор вложенных друг в друга компонентов.
Слишком глубокая вложенность плохо влияет на производительность: системе приходится тратить больше ресурсов на высчитывание размеров элементов исходя из параметров экрана и размеров друг относительно друга. Если мы верстаем, используя Compose, то это не очень актуально. Но для XML нужно стараться создавать как можно меньше вложенных слоев.
На этом уроке рассмотрим какие еще бывают лэйауты (или контейнеры) и какими свойствами они обладают.
Views делятся на 2 большие группы: view, которые непосредственно отрисовываются, и view, которые содержат в себе другие view — то есть контейнеры. Контейнеры отвечают за позиционирование и позволяют расставлять элементы на экране любым сложным образом.
Доступные лейауты можно посмотреть в палитре элементов Android Studio.
Из палитры можно перетаскивать элементы прямо в превью, двигать их, менять размер. Однако делать это не рекомендуется: верстка выходит из-под контроля, непредсказуемо появляются ненужные атрибуты и захардкоженные значения, что негативно влияет на адаптивность. В превью безопасно двигать только стрелки для ConstraintLayout, и то — следите за изменениями в коде.
Основные лейауты: FrameLayout, LinearLayout и ConstraintLayout. Исторически был еще RelativeLayout, который встречается в старых проектах, но сейчас не рекомендуется к использованию — он помечен как Deprecated, поскольку неэффективно рисует вложенные элементы. Находится в разделе Legacy. Всё с пометкой Legacy использовать не рекомендуется.
FrameLayout — наиболее простой тип лейаута. Это стек, в который складываются все вью: элементы внутри накладываются друг на друга в порядке добавления. Самый верхний — тот, который добавлен последним.
Атрибуты привязки (constraints) у вложенных элементов нужно убрать — вне ConstraintLayout они не влияют ни на что.
Если убрать все отступы у кнопок внутри FrameLayout, они наложатся друг на друга. Во вкладке ComponentTree отображаются все элементы макета в порядке вложенности.
Практически у всех элементов есть два основных атрибута для обозначения отступов:
android:layout_margin) — внешний отступ за пределами границ View.android:padding) — внутренний отступ внутри границ View.Чтобы кнопка не прилипала к границам экрана, можно:
android:padding="20dp"android:layout_margin="100dp"Если не уточнять сторону, отступы добавляются сразу по всем граням. Для конкретной стороны используются суффиксы: Start, Top, End, Bottom.
Важно: используйте
Start/EndвместоLeft/Right. ИспользованиеLeftвызовет предупреждение о возможных проблемах с поддержкой языков с правосторонним чтением (RTL).
Атрибуты gravity и layout_gravity отвечают за позиционирование элементов. Ключевое правило:
Например, android:layout_gravity="end" разместит кнопку у правой грани родительского контейнера (контейнер по умолчанию занимает весь экран).
Можно одновременно задавать позиционирование по обеим осям, разделяя значения вертикальной чертой:
android:layout_gravity="end|center"
Атрибут gravity влияет на содержимое самой вью. Например, android:gravity="bottom" прижмет текст кнопки к её нижней части.
Важно учитывать, что не все контейнеры поддерживают layout_gravity у потомков. FrameLayout — поддерживает.
LinearLayout расставляет потомков в ряд — горизонтально или вертикально, без наложения.
По умолчанию ориентация горизонтальная: элементы выстраиваются слева направо в порядке добавления. Для вертикального расположения используется атрибут:
android:orientation="vertical"
У вложенных элементов есть атрибут layout_weight — он задаёт вес элемента, и элементы автоматически делят свободное пространство контейнера пропорционально своим весам.
Дополнительно можно принудительно задать общую сумму весов через атрибут контейнера:
android:weightSum="4"
В этом случае размеры элементов пересчитываются относительно указанной суммы, и оставшееся место распределяется согласно ей. Атрибут weightSum используется реже, чем индивидуальная установка весов.
Контейнеры можно вкладывать друг в друга: например, LinearLayout с вертикальной ориентацией может содержать несколько LinearLayout с горизонтальной ориентацией, внутри которых располагаются текстовые поля, кнопки и другие View.
Самый продвинутый лейаут — ConstraintLayout — будет рассмотрен в отдельном уроке.