it-swarm.com.ru

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

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

629
Mojiiz

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

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

829
Flo

В двух словах 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)


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

238
ArK

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

Android:layout_width="0px"

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

67
roetzi

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

Вот изображение, чтобы прояснить ситуацию.

enter image description here

Теория

Термин "вес макета" связан с понятием средневзвешенное значение в математике. Это как в классе колледжа, где домашнее задание стоит 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>
34
Suragch

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

29
Tash Pemhiwa

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

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

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

Рассматривать,

15
George Nguyen

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

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

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

10
Andre Steingress

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

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

6
Vladimir Ivanov

Пожалуйста, посмотрите на WeightSum of 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>
3
Ming Leung

за дополнительную плату

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

Android:layout_height="0dp"

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

Android:layout_width="0dp"
2
Alen Lee

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

Flo & Rptwsthi и Roetzi,

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

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

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

0
user2837483

Добавление Android:autoSizeTextType="uniform" автоматически изменит размер текста

0
skryshtafovych