Какие основные ViewGroup существуют в Android и как располагаются элементы в них
Что проверяют
Понимаете ли вы, как контейнер меряет и расставляет детей, а не только помните названия классов. Следом почти всегда спрашивают, почему вложенные LinearLayout с весами тормозят и чем ConstraintLayout лучше, а сейчас ещё и как то же самое выглядит в Compose.
Как отвечать
Начните с механики: любой ViewGroup проходит два этапа, onMeasure и onLayout. Родитель передаёт ребёнку MeasureSpec с режимом EXACTLY, AT_MOST или UNSPECIFIED, ребёнок отвечает своим размером, потом родитель задаёт ему координаты. match_parent и wrap_content это просьбы, которые каждый контейнер трактует по-своему.
Затем основные контейнеры:
- LinearLayout: дети в ряд или в столбец по
orientation.layout_weightделит оставшееся место, обычно вместе с размером0dp. Веса требуют повторного измерения; - FrameLayout: дети накладываются друг на друга, положение задаёт
layout_gravity. Хорош как контейнер для фрагмента или оверлея; - RelativeLayout: позиция относительно родителя и соседей. Меряет детей дважды и сейчас считается устаревшим выбором;
- ConstraintLayout: связи по сторонам, цепочки,
Guideline,Barrier, смещениеbias. Позволяет собрать сложный экран плоско, без вложенности; - CoordinatorLayout: координирует поведение детей через
Behavior, классика сAppBarLayout, сворачиваемой шапкой и FAB; - ScrollView и NestedScrollView: один прямой ребёнок, вертикальная прокрутка;
- RecyclerView: тоже
ViewGroup, расположение отдаётLayoutManager(список, сетка, staggered), вью переиспользуются.
Закончите тем, что в Compose аналоги это Row, Column, Box, LazyColumn, и там повторное измерение ребёнка запрещено самим API.
Где спотыкаются
Кладут RecyclerView в ScrollView с wrap_content. Список создаёт все элементы сразу, и переиспользование пропадает.
Забывают про связи в ConstraintLayout: в редакторе вью стоит на месте, а на устройстве без ограничений прыгает в левый верхний угол. Для ширины «по ограничениям» нужен 0dp, а не match_parent.
Строят матрёшку из вложенных LinearLayout с весами, где каждый уровень умножает число проходов измерения.