Подтвердить что ты не робот

Понимание мерыWithLargestChild: зачем ломает макет?

Я играю с опцией measureWithLargestChild="true". Я не понимаю, почему мой макет разбивает общее количество, если одна из моих кнопок имеет слишком большой текст. Я думаю, что он должен поддерживать базовый размер 1/3, но он становится меньше около 1/6. Почему это?

Здесь вы можете увидеть несколько снимков экрана:

Button layout bug

Вот мой xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:baselineAligned="false"
    android:gravity="center"
    android:orientation="vertical" >
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:baselineAligned="false"
        android:measureWithLargestChild="true" >
        <Button
            style="@style/my_style"
            android:layout_weight="1"
            android:text="Button123456" />
        <Button
            style="@style/my_style"
            android:layout_weight="1"
            android:text="A" />
        <Button
            style="@style/my_style"
            android:layout_weight="1"
            android:text="WW" />
    </LinearLayout>
</LinearLayout>
4b9b3361

Ответ 1

Я считаю, что это ошибка в алгоритме измерения. В LinearLayout.measureHorizontal(int, int) есть следующий комментарий.

// Either expand children with weight to take up available space or
// shrink them if they extend beyond our current bounds

В нем говорится, что алгоритм будет сокращать элементы с помощью weight, если для них недостаточно места. Поскольку для параметра measureWithLargestChild установлено значение true, все элементы имеют ту же ширину, что и самый левый элемент. Теперь они все вместе больше не вписываются в родительскую ширину. Таким образом, они будут сокращены. Если ошибок не было, все предметы имели бы такую ​​же ширину после этого. Но из-за ошибки алгоритм сжимает исходную ширину (wrap_content) вместо ширины, рассчитанной в соответствии с атрибутом measureWithLargestChild. Вот почему два элемента справа стали меньше.