Что означает 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>
Это выглядит так:
и
Ответ 5
Если существует несколько видов, охватывающих 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
, тогда вы, конечно, использовали бы 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, то одна треть оставшегося пространства будет передана первой, а вторая третья - второй (потому что мы утверждаем, что вторая важнее).
Ответ 8
http://developer.android.com/guide/topics/ui/layout-objects.html#linearlayout
layout_weight определяет, сколько пространства элемент управления должен получить соответственно другим элементам управления.
Ответ 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
.