вид не привязан к верху на LinearLayout

У меня есть LinearLayout и его XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center"
    android:orientation="horizontal"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/button3"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="Button" />

    <Button
        android:id="@+id/button2"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="3"
        android:text="Button" />

    <Button
        android:id="@+id/button"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="2"
        android:text="Button" />
</LinearLayout>

и это результат:

введите здесь описание изображения

как вы можете видеть, верхняя левая кнопка имеет небольшое поле сверху, но, как показывает код, полей нет. почему это происходит?

также есть странное решение: если вы установите gravity:top для всех кнопок, вы получите ожидаемый результат. но зачем это вообще нужно, потому что linearlayout(horiz) должен начинать добавлять элементы сверху слева направо вверх.


person ClassY    schedule 28.05.2021    source источник


Ответы (3)


Я ссылался на некоторые документы и потоки SO для поиска решения, так как вопрос показался мне очень интересным.

Наконец я узнал причину.

Горизонтальный LinearLayout по умолчанию выравнивает базовые линии всех своих дочерних элементов управления. Таким образом, первая строка текста в вашей многострочной кнопке выравнивается по вертикали с одной строкой текста в других кнопках.

Чтобы отключить это поведение, установите android:baselineAligned="false" в LinearLayout.

Вся заслуга в этом ответе принадлежит @Karu: https://stackoverflow.com/a/8290258/4211264

person Bhargav Thanki    schedule 28.05.2021

Это связано с обтеканием текста первой кнопкой. Две другие кнопки занимают слишком много места на экране. И первая кнопка попробуй остаться на экране за счет самообертывания. Я не знаю, какая у тебя задача. Если вы хотите, чтобы кнопки располагались в одной строке, попробуйте использовать layout_weight = 1 для всех кнопок.

person Konstantin Lysyy    schedule 28.05.2021
comment
Привет. Благодарю за ваш ответ. высоты настроены на перенос. так разве это не должно растягивать кнопку по вертикали, пока она не поместится? если это так, почему это получает запас сверху, поскольку это не имеет ничего общего с его шириной - person ClassY; 28.05.2021

Это потому, что вы присвоили разный вес каждой кнопке. Вы должны придать равный вес каждой кнопке. Замените код файла макета на этот.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:orientation="horizontal"
tools:context=".MainActivity">

<Button
    android:id="@+id/button3"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:text="Button" />

<Button
    android:id="@+id/button2"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:text="Button" />

<Button
    android:id="@+id/button"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:text="Button" />
person paul035    schedule 28.05.2021
comment
Привет. Благодарю за ваш ответ. но это даст равную ширину всем прямым дочерним элементам. моя проблема в том, что маржа, которую он получает сверху, которую нигде нельзя найти. - person ClassY; 28.05.2021
comment
ОП спросил причину дополнительного поля вверху первой кнопки. И в зависимости от требований может потребоваться присвоить разный вес всем виджетам. - person Bhargav Thanki; 28.05.2021