Что означает android: layout_weight?

Я не понимаю, как использовать этот атрибут. Может ли кто-нибудь рассказать мне больше об этом?

Ответ 1

С помощью layout_weight вы можете указать соотношение размеров между несколькими видами. Например. у вас есть MapView и table, которые должны отображать некоторую дополнительную информацию на карте. Карта должна использовать 3/4 экрана, а таблица должна использовать 1/4 экрана. Затем вы установите для параметра layout_weight map значение 3 и layout_weight table равным 1.

Чтобы получить работу, вы также должны установить высоту или ширину (в зависимости от вашей ориентации) до 0px.

Ответ 2

В двух словах layout_weight указывает, какая часть дополнительного пространства в макете будет выделена для представления.

LinearLayout поддерживает присвоение веса отдельным детям. Этот атрибут присваивает значение "важность" для представления и позволяет ему расширяться для заполнения любого оставшегося пространства в родительском представлении. Просмотров 'по умолчанию равен нулю.

Вычисление для назначения любого оставшегося пространства между дочерним элементом

В общем, формула:

пробел, присвоенный child = (индивидуальный вес ребенка)/(сумма веса каждого ребенка в линейной компоновке)

Пример 1

Если есть три текстовых поля, а два из них объявляют вес 1, а третьему не присваивается вес (0), тогда оставшееся пространство присваивается следующим образом:

1-й текстовый блок = 1/(1 + 1 + 0)

2-й текстовый блок = 1/(1 + 1 + 0)

Третий текстовый блок = 0/(1 + 1 + 0)

Пример 2

Скажем, у нас есть текстовая метка и два элемента редактирования текста в горизонтальной строке. Метка не имеет layout_weight, поэтому она занимает минимальное пространство, необходимое для рендеринга. Если для параметра layout_weight каждого из двух элементов редактирования текста установлено значение 1, оставшаяся ширина в родительском макете будет разделена поровну между ними (потому что мы утверждаем, что они одинаково важны).

Расчет:

1-я метка = 0/(0 + 1 + 1)

2-й текстовый блок = 1/(0 + 1 + 1)

3-й текстовый блок = 1/(0 + 1 + 1)

Если вместо этого первое текстовое поле имеет layout_weight 1, а второе текстовое поле имеет layout_weight из 2, то одна треть оставшегося пространства будет передана первой, а две трети ко второму (потому что мы утверждаем, что вторая важнее).

Расчет:

1-я метка = 0/(0 + 1 + 2)

2-й текстовый блок = 1/(0 + 1 + 2)

3-й текстовый блок = 2/(0 + 1 + 2)


Исходная статья

Ответ 3

добавив к другим ответам, самое главное, чтобы заставить это работать, - установить ширину (или высоту) макета в 0px

android:layout_width="0px"

в противном случае вы увидите мусор

Ответ 4

layout_weight сообщает Android, как распространять View в LinearLayout. Затем Android вычисляет общую долю, необходимую для всех View, которые имеют заданный вес, и помещает каждый View в зависимости от того, какая часть экрана, который она указала в нем. В следующем примере Android видит, что TextView имеет layout_weight из 0 (это значение по умолчанию), а EditText имеет layout_weight of 2 каждый, тогда как Button имеет вес 1. Таким образом, Android выделяет "достаточно" для отображения tvUsername и tvPassword, а затем делит оставшуюся часть ширины экрана на 5 равных частей, две из которых выделены для etUsername, от двух до etPassword, а последняя часть до bLogin:

<LinearLayout android:orientation="horizontal" ...>

    <TextView android:id="@+id/tvUsername" 
    android:text="Username" 
    android:layout_width="wrap_content" ... />

    <EditText android:id="@+id/etUsername"
    android:layout_width="0dp"
    android:layout_weight="2" ... />

    <TextView android:id="@+id/tvPassword"
    android:text="Password"
    android:layout_width="wrap_content" />

    <EditText android:id="@+id/etPassword"
    android:layout_width="0dp"
    android:layout_weight="2" ... />

    <Button android:id="@+id/bLogin"
    android:layout_width="0dp"
    android:layout_weight="1"
    android:text="Login"... />

</LinearLayout>

Это выглядит так: landscape orientation и
portrait orientation

Ответ 5

Если существует несколько видов, охватывающих LinearLayout, то layout_weight дает каждому из них пропорциональный размер. Вид с большим значением layout_weight "весит" больше, поэтому он получает больше места.

Вот изображение, чтобы сделать вещи более ясными.

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

Теория

Макет макета термина относится к понятию средневзвешенное значение в математике. Это похоже на класс колледжа, где домашняя работа стоит 30%, посещаемость стоит 10%, средний срок стоит 20%, а финал стоит 40%. Ваши оценки для тех частей, когда они взвешены вместе, дают вам общую оценку.

enter image description here

То же самое для веса макета. Views в горизонтальном LinearLayout может принимать определенный процент от общей ширины. (Или процент от высоты для вертикали LinearLayout.)

Макет

LinearLayout, который вы используете, будет выглядеть примерно так:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <!-- list of subviews -->

</LinearLayout>

Обратите внимание, что вы должны использовать layout_width="match_parent" для LinearLayout. Если вы используете wrap_content, это не сработает. Также обратите внимание, что layout_weight не работает для просмотров в RelativeLayouts (здесь здесь и здесь для ответов SO касающихся этой проблемы).

Представления

Каждый вид в горизонтальном LinearLayout выглядит примерно так:

<Button
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1" />

Обратите внимание, что вам нужно использовать layout_width="0dp" вместе с layout_weight="1". Забыть это вызывает много новых проблем пользователей. (См. в этой статье для разных результатов, которые вы можете получить, не устанавливая ширину в 0.) Если ваши представления находятся в вертикальном LinearLayout, тогда вы, конечно, использовали бы layout_height="0dp".

В приведенном выше примере Button я установил вес в 1, но вы можете использовать любое число. Это имеет значение только общее. Вы можете видеть в трех строках кнопок первого изображения, которое я разместил, цифры все разные, но поскольку пропорции одинаковы, взвешенная ширина не изменяется в каждой строке. Некоторым людям нравится использовать десятичные числа, которые имеют сумму 1, так что в сложной компоновке ясно, какой вес каждой части.

Последнее замечание. Если у вас много вложенных макетов, которые используют layout_weight, это может быть плохо для производительности.

Дополнительные

Вот макет xml для верхнего изображения:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="android:layout_weight="
        android:textSize="24sp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

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

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="2"
            android:text="2" />

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

    </LinearLayout>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="android:layout_weight="
        android:textSize="24sp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="10"
            android:text="10" />

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="20"
            android:text="20" />

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="10"
            android:text="10" />

    </LinearLayout>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="android:layout_weight="
        android:textSize="24sp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight=".25"
            android:text=".25" />

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight=".50"
            android:text=".50" />

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight=".25"
            android:text=".25" />

    </LinearLayout>

</LinearLayout>

Ответ 6

Подумайте об этом, будет проще

Если у вас есть 3 кнопки, и их весы равны 1,3,1 соответственно, он будет работать как таблица в HTML

Предоставьте 5 частей для этой линии: 1 часть для кнопки 1, 3 для кнопок 2 и 1 для кнопки 1

связи

Ответ 7

одним из лучших объяснений для меня было этот (из учебника Android, посмотрите на шаг 7):

layout_weight используется в LinearLayouts для назначения "важности" представлениям в макете. У всех представлений есть default_weight по умолчанию, равный нулю, то есть они занимают только столько места на экране, сколько нужно отображать. Назначение значения выше нуля разделит оставшуюся часть доступного пространства в родительском представлении в соответствии со значением каждого вида layout_weight и его отношением к общему размеру макета, указанному в текущем макете для этого и других элементов View.

Чтобы привести пример: допустим, у нас есть текстовая метка и два элемента редактирования текста в горизонтальной строке. У метки нет указателя макета, поэтому он занимает минимальное пространство, необходимое для рендеринга. Если layout_weight каждого из двух элементов редактирования текста установлен в 1, оставшаяся ширина в родительском макете будет разделена поровну между ними (потому что мы утверждаем, что они одинаково важны). Если первый имеет layout_weight из 1, а второй имеет layout_weight из 2, то одна треть оставшегося пространства будет передана первой, а вторая третья - второй (потому что мы утверждаем, что вторая важнее).

Ответ 9

Объединяя оба ответа от

Flo и rptwsthi и roetzi,

Не забудьте изменить свой layout_width=0dp/px, иначе поведение layout_weight будет действовать наоборот, при этом наибольшее число заняло наименьшее место, а самое низкое число заняло самое большое пространство.

Кроме того, некоторая комбинация весов приведет к тому, что некоторая компоновка не может быть показана (поскольку она заняла пространство).

Остерегайтесь этого.

Ответ 10

Посмотрите на weightSum LinearLayout и layout_weight каждого представления. android: weightSum = "4" android: layout_weight = "2" android: layout_weight = "2" Их layout_height оба являются 0px, но я не уверен, что он является релевантным

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:weightSum="4">

<fragment android:name="com.example.SettingFragment"
    android:id="@+id/settingFragment"
    android:layout_width="match_parent"
    android:layout_height="0px"
    android:layout_weight="2"
    />

<Button
    android:id="@+id/dummy_button"
    android:layout_width="match_parent"
    android:layout_height="0px"
    android:layout_weight="2"
    android:text="DUMMY"
    />
</LinearLayout>

Ответ 11

Как следует из названия, вес макета определяет, какое количество или процент пространства занимает конкретное поле или виджет, занимающий пространство экрана.
Если мы укажем вес в горизонтальной ориентации, тогда мы должны указать layout_width = 0px.
Аналогично, если мы укажем вес в вертикальной ориентации, тогда мы должны указать layout_height = 0px.