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

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

Solutions Collecting From Web of "Что означает android: layout_weight?"

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

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

layout_weight , 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" 

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

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

Это выглядит как:
альбомная ориентация а также
Портретная ориентация

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

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

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

теория

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

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

Это одинаково для макета макета. 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 вы, 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> 

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

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

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

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

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

Layout_weight используется в LinearLayouts для назначения «важности» Views в макете. Все представления имеют макет по умолчанию default_weight, что означает, что они занимают только столько места на экране, сколько необходимо отобразить. При назначении значения выше нуля будет разделяться остальная часть доступного пространства в родительском представлении в соответствии со значением каждого макета view_weight View и его отношением к общему макету, указанному в текущем макете для этого и других элементов View.

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

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

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

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

Flo & rptwsthi и roetzi,

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

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

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

 <?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> 

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