Я не понимаю, как использовать этот атрибут. Кто-нибудь может рассказать мне больше об этом?
650
Я не понимаю, как использовать этот атрибут. Кто-нибудь может рассказать мне больше об этом?
С layout_weight
его помощью можно указать соотношение размеров между несколькими видами. Например, у вас есть MapView
и, table
которые должны показать некоторую дополнительную информацию на карту. Карта должна использовать 3/4 экрана, а таблица - 1/4 экрана. Тогда вы будете установить layout_weight
из map
до 3 , и layout_weight
из table
1.
Чтобы это работало, вы также должны установить высоту или ширину (в зависимости от вашей ориентации) в 0px.
В двух словах,
layout_weight
указывает, сколько дополнительного пространства в макете будет выделено для представления.LinearLayout поддерживает назначение веса отдельным детям. Этот атрибут присваивает представлению значение важности и позволяет ему расширяться, чтобы заполнить все оставшееся пространство в родительском представлении. Вес просмотров по умолчанию равен нулю.
Расчет, чтобы назначить любое оставшееся пространство между дочерними
В общем формула выглядит так:
Пример 1
Если есть три текстовых поля и два из них объявляют вес 1, а третьему не присваивается вес (0), то оставшееся пространство присваивается следующим образом:
Пример 2
Допустим, у нас есть текстовая метка и два элемента редактирования текста в горизонтальной строке. Метка не
layout_weight
указана, поэтому она занимает минимальное пространство, необходимое для визуализации. Еслиlayout_weight
для каждого из двух элементов редактирования текста установлено значение 1, оставшаяся ширина в родительском макете будет разделена поровну между ними (поскольку мы утверждаем, что они одинаково важны).Расчет:
Если вместо этого первое текстовое поле имеет значение
layout_weight
1, а второе текстовое поле имеет значениеlayout_weight
2, то одна треть оставшегося пространства будет отдана первому, а две трети - второму (поскольку мы требуем второе один важнее).Расчет:
Исходная статья
источник
android:layout_width="0px"
это важно. Кроме того, веса не должны быть целыми числами.weightSum
тогда картинка? Это как-то связаноlayout_weight
?добавляя к другим ответам, самое главное, чтобы это работало, это установить ширину макета (или высоту) в 0px
в противном случае вы увидите мусор
источник
Если существует несколько представлений, охватывающих a
LinearLayout
, тогдаlayout_weight
каждому из них присваивается пропорциональный размер. Представление с большимlayout_weight
значением «весит» больше, поэтому оно получает больше места.Вот изображение, чтобы прояснить ситуацию.
теория
Термин «вес макета» связан с понятием средневзвешенного в математике. Это как в классе колледжа, где домашнее задание стоит 30%, посещаемость - 10%, промежуточный - 20%, а финальный - 40%. Ваши оценки по этим частям, при взвешивании вместе, дают вам общую оценку.
То же самое для веса макета. Каждый
Views
горизонтальный элементLinearLayout
может занимать определенный процент от общей ширины. (Или процент от высоты для вертикалиLinearLayout
.)Расположение
То,
LinearLayout
что вы используете, будет выглядеть примерно так:Обратите внимание, что вы должны использовать
layout_width="match_parent"
дляLinearLayout
. Если вы используетеwrap_content
, то это не будет работать. Также обратите внимание, чтоlayout_weight
это не работает для представлений в RelativeLayouts (см. Здесь и здесь ответы SO, касающиеся этой проблемы).Виды
Каждый горизонтальный
LinearLayout
вид выглядит примерно так:Обратите внимание, что вам нужно использовать
layout_width="0dp"
вместе сlayout_weight="1"
. Забывание этого вызывает много новых проблем пользователей. (См. Эту статью для других результатов, которые вы можете получить, не устанавливая ширину равной 0.) Если ваши представления расположены по вертикали,LinearLayout
то вы быlayout_height="0dp"
, конечно, использовали.В
Button
приведенном выше примере я установил вес на 1, но вы можете использовать любое число. Только общее значение имеет значение. Вы можете видеть в трех рядах кнопок на первом изображении, которое я разместил, все цифры разные, но поскольку пропорции одинаковы, взвешенная ширина не меняется в каждой строке. Некоторым людям нравится использовать десятичные числа с суммой 1, чтобы в сложном макете было ясно, каков вес каждой части.Последнее замечание Если у вас много вложенных макетов, которые используют
layout_weight
, это может ухудшить производительность.дополнительный
Вот макет XML для верхнего изображения:
источник
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
:Это выглядит так:
и
источник
Подумай так, будет проще
Если у вас есть 3 кнопки и их вес 1,3,1 соответственно, он будет работать как таблица в HTML
Обеспечьте 5 частей для этой строки: 1 часть для кнопки 1, 3 части для кнопки 2 и 1 часть для кнопки 1
Рассматривать,
источник
Одним из лучших объяснений для меня было это (из учебника по Android, ищите шаг 7) :
источник
http://developer.android.com/guide/topics/ui/layout-objects.html#linearlayout
layout_weight определяет, сколько места должен получить элемент управления соответственно другим элементам управления.
источник
Для дополнительного :
Для
vertical
ориентации не забудьте установитьheight
0dpДля
horizontal
ориентации не забудьте установитьwidth
0dpисточник
Пожалуйста, посмотрите на WeightSum of LinearLayout и layout_weight каждого вида. android: weightSum = "4" android: layout_weight = "2" android: layout_weight = "2" Их layout_height равны 0px, но я не уверен, что это актуально
источник
Объединяя оба ответа от
Flo & rptwsthi и roetzi,
Не забудьте изменить свое
layout_width=0dp/px
, иначеlayout_weight
поведение будет действовать в обратном порядке: наибольшее число занимало наименьшее пространство, а наименьшее число занимало наибольшее пространство.Кроме того, некоторая комбинация весов приведет к тому, что какая-то раскладка не может быть показана (так как она занимала пространство).
Остерегайтесь этого.
источник
Добавление
android:autoSizeTextType="uniform"
изменит размер текста для вас автоматическиисточник
Как следует из названия, Layout weight указывает, какой объем или процент пространства определенного поля или виджета должен занимать пространство экрана.
Если мы указываем вес в горизонтальной ориентации, то мы должны указать
layout_width = 0px
.Точно так же, если мы указываем вес в вертикальной ориентации, то мы должны указать
layout_height = 0px
.источник