Ответы:
С layout_weight
его помощью можно указать соотношение размеров между несколькими видами. Например, у вас есть MapView
и, table
которые должны показать некоторую дополнительную информацию на карту. Карта должна использовать 3/4 экрана, а таблица - 1/4 экрана. Тогда вы будете установить layout_weight
из map
до 3 , и layout_weight
из table
1.
Чтобы это работало, вы также должны установить высоту или ширину (в зависимости от вашей ориентации) в 0px.
В двух словах, layout_weight
указывает, сколько дополнительного пространства в макете будет выделено для представления.
LinearLayout поддерживает назначение веса отдельным детям. Этот атрибут присваивает представлению значение важности и позволяет ему расширяться, чтобы заполнить все оставшееся пространство в родительском представлении. Вес просмотров по умолчанию равен нулю.
В общем формула выглядит так:
пространство, назначенное ребенку = (индивидуальный вес ребенка) / (сумма веса каждого ребенка в линейном расположении)
Если есть три текстовых поля и два из них объявляют вес 1, а третьему не присваивается вес (0), то оставшееся пространство присваивается следующим образом:
1-е текстовое поле = 1 / (1 + 1 + 0)
2-е текстовое поле = 1 / (1 + 1 + 0)
3-е текстовое поле = 0 / (1 + 1 + 0)
Допустим, у нас есть текстовая метка и два элемента редактирования текста в горизонтальной строке. Метка не 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)
android:layout_width="0px"
это важно. Кроме того, веса не должны быть целыми числами.
weightSum
тогда картинка? Это как-то связано layout_weight
?
добавляя к другим ответам, самое главное, чтобы это работало, это установить ширину макета (или высоту) в 0px
android:layout_width="0px"
в противном случае вы увидите мусор
Если существует несколько представлений, охватывающих a 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>
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>
Это выглядит так:
и
Подумай так, будет проще
Если у вас есть 3 кнопки и их вес 1,3,1 соответственно, он будет работать как таблица в HTML
Обеспечьте 5 частей для этой строки: 1 часть для кнопки 1, 3 части для кнопки 2 и 1 часть для кнопки 1
Рассматривать,
Одним из лучших объяснений для меня было это (из учебника по Android, ищите шаг 7) :
layout_weight используется в LinearLayouts для присвоения «важности» представлениям в макете. Все виды имеют по умолчанию layout_weight, равный нулю, что означает, что они занимают столько места на экране, сколько необходимо для отображения. Присвоение значения больше нуля разделит оставшуюся часть свободного пространства в родительском представлении в соответствии со значением layout_weight каждого представления и его отношением к общему layout_weight, указанному в текущем макете для этого и других элементов View.
Для примера: допустим, у нас есть текстовая метка и два элемента редактирования текста в горизонтальной строке. В метке не указан 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 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>
Объединяя оба ответа от
Flo & rptwsthi и roetzi,
Не забудьте изменить свое layout_width=0dp/px
, иначе layout_weight
поведение будет действовать в обратном порядке: наибольшее число занимало наименьшее пространство, а наименьшее число занимало наибольшее пространство.
Кроме того, некоторая комбинация весов приведет к тому, что какая-то раскладка не может быть показана (так как она занимала пространство).
Остерегайтесь этого.
Добавление android:autoSizeTextType="uniform"
изменит размер текста для вас автоматически
Как следует из названия, Layout weight указывает, какой объем или процент пространства определенного поля или виджета должен занимать пространство экрана.
Если мы указываем вес в горизонтальной ориентации, то мы должны указать layout_width = 0px
.
Точно так же, если мы указываем вес в вертикальной ориентации, то мы должны указать layout_height = 0px
.