Что означает android: layout weight?


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

13 594

13 ответов:

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

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

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

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

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

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

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

Пример 1

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

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

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

3-е текстовое поле = 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)


статьи

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

android:layout_width="0px"

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

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

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

enter image description here

теория

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

enter image description here

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

Расположение

The 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 (см. здесь и здесь для так ответов, связанных с этим вопросом).

Мнения

каждый вид по горизонтали 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>

layout_weight рассказывает Android, как распространять ваш ViewС LinearLayout. Затем Android сначала вычисляет общую долю, необходимую для всех Views, которые имеют определенный вес и размещают каждый View согласно какой части экрана он указал, что ему нужно. В следующем примере Android видит, что TextViewС layout_weight of 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

думаю, что это так, будет проще

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

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

связи

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

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

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

http://developer.android.com/guide/topics/ui/layout-objects.html#linearlayout

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

пожалуйста, посмотрите на 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>

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

на vertical ориентация, не забудьте установить height в 0dp хиллингдон

android:layout_height="0dp"

на horizontal ориентация, не забудьте установить width в 0dp хиллингдон

android:layout_width="0dp"

объединение обоих ответов от

Flo & rptwsthi и roetzi,

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

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

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

добавлять android:autoSizeTextType="uniform" изменит размер текста для вас автоматически

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