Гарантируется ли, что сумма абсолютных ширин детей не превысит ширину контейнера
Что проверяют
Это уточняющий вопрос к задаче на раскладку: реализовать контейнер, который делит ширину между детьми с фиксированными и относительными размерами. Интервьюер смотрит, выясняете ли вы инварианты до кода, и обычно отвечает «нет, не гарантируется». Дальше спросят, что тогда делает ваш алгоритм.
Как отвечать
Зафиксируйте ответ, предложите поведение при переполнении и только потом пишите код:
- остаток:
remaining = containerWidth - padding - sum(fixed). Детям с весами раздавайтеmax(0, remaining), иначе получите отрицательные ширины; - политика переполнения: обрезать лишнее, пропорционально сжать фиксированных детей, перенести на новую строку или вернуть ошибку. Выбор назовите вслух и согласуйте;
- округление: при делении в пикселях сумма целых частей не совпадёт с шириной контейнера. Остаток раздают по пикселю или отдают последнему ребёнку, чтобы не было щели;
- краевые случаи: нулевая сумма весов, пустой список, отрицательные значения на входе, отступы между детьми.
Хорошо показать, как это решает сам Android. Родитель передаёт ребёнку MeasureSpec с режимом EXACTLY, AT_MOST или UNSPECIFIED, но ребёнок может хотеть больше: в режиме AT_MOST resolveSizeAndState вернёт размер родителя с флагом MEASURED_STATE_TOO_SMALL. LinearLayout при нехватке места распределяет отрицательный остаток только между детьми с layout_weight, а дети с фиксированными dp не сжимаются, и не влезшее обрезается по границе контейнера. В Compose Modifier.width уступает входящим ограничениям, а Modifier.requiredWidth нет: ребёнок вылезает за выделенное место и центрируется относительно него.
Где спотыкаются
Молча принимают, что сумма всегда влезает, и получают отрицательные ширины у весовых детей на первом же тесте интервьюера.
Считают во float и забывают про округление, из-за чего сумма расходится с шириной контейнера на один-два пикселя.
Уходят в пересказ XML-атрибутов вместо алгоритма. Это задача на код: от вас ждут функцию и её поведение на краях, а знание ConstraintLayout здесь вторично.