Почему стоит использовать ConstraintLayout вместо LinearLayout и FrameLayout
Что проверяют
Понимаете ли, откуда берётся выигрыш, или повторяете лозунг «ConstraintLayout всегда быстрее». Правильный ответ звучит как «он позволяет не вкладывать макеты друг в друга», и дальше от вас ждут, при чём тут этапы измерения и раскладки.
Как отвечать
Разметка на вьюхах считается рекурсивным обходом дерева. Чем глубже вложенность, тем больше проходов, а некоторые конструкции их удваивают: LinearLayout с весами измеряет детей дважды, потому что сначала узнаёт желаемый размер, потом распределяет остаток. Два таких, вложенных друг в друга, дают уже четыре прохода на лист, и дальше растёт быстро.
ConstraintLayout решает это тем, что связи описываются между соседями, и сложный экран укладывается в один уровень вложенности. Инструменты для этого: цепочки вместо вложенных контейнеров с весами, барьеры вместо подгонки размеров руками, направляющие для процентных отступов, Group для показа и скрытия набора вьюх разом, виртуальные контейнеры вроде Flow. Размер по связям задаётся нулём (0dp), а не match_parent.
Дальше честно сказать про обратную сторону. Сам по себе ConstraintLayout дороже простого контейнера: его решатель делает больше работы на каждую вьюху. Для строки с иконкой и текстом LinearLayout быстрее и читается проще, а FrameLayout остаётся правильным выбором, когда надо наложить одну вьюху на другую или держать контейнер фрагмента. Выигрыш появляется там, где плоская разметка заменяет три или четыре уровня вложенности, а не один.
Где спотыкаются
Говорят «плоская иерархия всегда быстрее» и заворачивают в ConstraintLayout две вьюхи в ряд. Выигрыша нет, а разметка становится вдвое многословнее.
Забывают, что каждой вьюхе нужны связи по обеим осям. Без вертикальной связи элемент в редакторе стоит на месте, а в приложении уезжает в левый верхний угол. Это классический баг, которого не видно до запуска.
Третье: вкладывают ConstraintLayout внутрь ConstraintLayout или ставят детям match_parent. Вложенный решатель съедает весь смысл затеи, а match_parent у ребёнка конфликтует со связями, вместо него нужен 0dp.