Как работает система расположения вью в Android
Что проверяют
Знаете ли вы, что экран в Android собирается в три прохода: измерение, размещение и отрисовка, и что главную роль в них играет родитель. Следом обычно спрашивают, чем requestLayout() отличается от invalidate() и почему глубокая вложенность тормозит.
Как отвечать
Начните с иерархии: интерфейс это дерево, где листья наследуют View, а контейнеры наследуют ViewGroup и отвечают за расположение детей. Обход дерева запускает ViewRootImpl на очередном кадре, если что-то помечено как изменённое.
- measure: родитель вызывает у ребёнка
measure()и передаётMeasureSpec, это режим плюс размер. Режимы:EXACTLY(точный размер),AT_MOST(так приходитwrap_content, не больше заданного),UNSPECIFIED(сколько угодно, так меряют детей внутриScrollView). Ребёнок считает себя вonMeasure()и обязан вызватьsetMeasuredDimension(); - layout: родитель в
onLayout()вызываетlayout(l, t, r, b)у каждого ребёнка, то есть назначает ему итоговый прямоугольник; - draw:
draw()рисует фон, затемonDraw(), затем детей черезdispatchDraw().
Назовите два триггера: requestLayout() поднимается к корню и заново запускает measure и layout, а invalidate() просит только перерисовку. Хороший ответ добавит цену вложенности: RelativeLayout и LinearLayout с layout_weight меряют детей дважды, и на глубокой иерархии это умножается. Поэтому сложные экраны делают плоскими через ConstraintLayout. Упомяните Jetpack Compose: там те же фазы (composition, layout, drawing), но мерить ребёнка дважды за проход запрещено, и экспоненциального роста нет.
Где спотыкаются
Называют LinearLayout и ConstraintLayout «Layout Managers». Этот термин относится к RecyclerView.LayoutManager, и путаница сразу выдаёт поверхностное знание.
Путают requestLayout() и invalidate() и зовут первый там, где хватило бы второго: ради смены цвета пересчитывается геометрия всего дерева.
В кастомной вью переопределяют onMeasure() и игнорируют режим MeasureSpec. Реализация по умолчанию трактует AT_MOST как EXACTLY, поэтому wrap_content ведёт себя как match_parent.