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

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

630 голосов
/ 22 октября 2010

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

Ответы [ 13 ]

830 голосов
/ 22 октября 2010

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

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

238 голосов
/ 22 октября 2010

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


Источник статьи

67 голосов
/ 15 августа 2012

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

android:layout_width="0px"

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

34 голосов
/ 18 апреля 2015

Если существует несколько видов, охватывающих 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, тогда вы должны использовать Конечно.

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

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

Extra

Вот 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>
29 голосов
/ 23 февраля 2014

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

15 голосов
/ 04 ноября 2011

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

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

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

Regard,

10 голосов
/ 19 июля 2011

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

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

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

6 голосов
/ 22 октября 2010

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

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

3 голосов
/ 28 февраля 2017

Пожалуйста, посмотрите на WeightSum of LinearLayout и layout_weight каждого View. 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>
2 голосов
/ 24 июня 2018

Для дополнительных

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

android:layout_height="0dp"

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

android:layout_width="0dp"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...