Какие виды layout существуют в Android и их иерархия
Что проверяют
Ориентируетесь ли вы в стандартных контейнерах и понимаете ли, чем платите за вложенность. Перечислить пять имён мало, интервьюер ждёт связки с проходами измерения и производительностью. Следом спрашивают, что происходит от вызова setContentView до появления пикселей на экране.
Как отвечать
Сначала иерархия классов: View умеет рисовать себя и обрабатывать касания, ViewGroup наследуется от него и добавляет детей с правилами расстановки. Все контейнеры это наследники ViewGroup. Важно: атрибуты вида layout_width и layout_gravity принадлежат не самому View, а классу LayoutParams родителя. Отсюда правило: gravity про содержимое внутри View, layout_gravity про положение View в родителе.
Дальше по контейнерам:
FrameLayout: дети накладываются друг на друга, самый дешёвый контейнер, обычный хост для фрагментов;LinearLayout: строка или колонка. Веса удобны, но заставляют измерять детей дважды;RelativeLayout: позиционирование относительно соседей, тоже два прохода измерения, в новом коде вытеснен;ConstraintLayout: связи, цепочки, барьеры, направляющие,0dpкак размер по ограничениям. Позволяет держать плоское дерево вместо вложенных линейных;CoordinatorLayout: контейнер с поведениями, на нём держится сворачивающийся тулбар;ScrollViewиNestedScrollView: прокрутка длинного блока, для списков вместо нихRecyclerView.
Про производительность главное: измерение и раскладка идут рекурсивно по дереву, вложенные веса умножают число проходов, а лишние фоны дают перерисовку пикселей.
Уместно добавить, что новый код пишут на Compose с его собственной системой раскладки, а знание XML нужно для поддержки старых экранов.
Где спотыкаются
Ставят ребёнку ScrollView высоту match_parent или вкладывают прокрутку в прокрутку по той же оси: экран либо не двигается, либо дёргается.
Строят интерфейс из вложенных LinearLayout с весами. Каждый уровень удваивает работу измерения, и на слабом устройстве это видно по пропущенным кадрам.
Путают gravity и layout_gravity, а потом не понимают, почему атрибут «не работает»: родитель просто не поддерживает такой LayoutParams.