Согласно документации, android:weightSum
определяется максимальная сумма веса и рассчитывается как сумма layout_weight
всех детей, если не указано явно.
Давайте рассмотрим пример с LinearLayout
горизонтальной ориентацией и 3 ImageViews
внутри. Теперь мы хотим, чтобы они ImageViews
всегда занимали одинаковое пространство. Чтобы добиться этого, вы можете установить layout_weight
для каждого ImageView
значение 1, и weightSum
будет рассчитано равным 3, как показано в комментарии.
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
<!-- android:weightSum="3" -->
android:orientation="horizontal"
android:layout_gravity="center">
<ImageView
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_width="0dp"/>
.....
weightSum
полезно для правильного отображения макета для любого устройства, что не произойдет, если вы установите ширину и высоту напрямую.
weightSum
. Поведение в вашем примере будет идентичнымweightSum
опущенному, и фактически в этом сценарии не следует указывать weightSum. Документация говорит,weightSum Defines the maximum weight sum. If unspecified, the sum is computed by adding the layout_weight of all of the children.
Добавление к ответам SuperM и Джеффа,
Если в LinearLayout есть 2 представления: первое с layout_weight, равным 1, второе с layout_weight, равным 2, и без указания weightSum, по умолчанию weightSum рассчитывается как 3 (сумма весов дочерних элементов) и первый вид занимает 1/3 пространства, а второй - 2/3.
Однако, если бы мы указали весовую сумму 5, первое заняло бы 1/5-ю часть пространства, а второе заняло бы 2/5-е. Таким образом, в общей сложности 3/5 пространства будет занимать макет, оставляя оставшиеся пустыми.
источник
Весовая сумма работает точно так, как вы хотите (как и другие ответы, вам не нужно суммировать все веса на родительском макете). В поле зрения ребенка укажите вес, который вы хотите принять. Не забудьте указать
Ниже приведен пример
Это будет выглядеть
источник
Документация говорит , что лучше , и включает в себя пример, (подсветка шахты).
Итак, чтобы исправить пример superM, предположим, что у вас есть
LinearLayout
горизонтальная ориентация, которая содержит дваImageViews
и aTextView
с. Вы определяете,TextView
чтобы иметь фиксированный размер, и вы хотите, чтобы эти два занималиImageViews
оставшееся пространство одинаково.Для этого вы должны применить
layout_weight
1 к каждомуImageView
, ни один дляTextView
, иweightSum
2,0 дляLinearLayout
.источник
После некоторых экспериментов я думаю, что алгоритм для LinearLayout такой:
Предположим, что
weightSum
установлено значение. Случай отсутствия обсуждается позже.Во- первых, разделить
weightSum
на количество элементов тиmatch_parent
илиfill_parent
в размерности LinearLayout (например ,layout_width
дляorientation="horizontal"
). Мы назовем это значение множителем веса для каждого элемента. Значение по умолчанию дляweightSum
1.0 - это, следовательно, множитель веса по умолчанию1/n
, гдеn
- количествоfill_parent
элементов;wrap_content
элементы не способствуютn
.Например, когда
weightSum
60, и есть 3fill_parent
элемента, множитель веса равен 20. Умножитель веса является значением по умолчанию, например,layout_width
если атрибут отсутствует.Во-вторых, максимально возможное расширение каждого элемента вычисляется. Во-первых,
wrap_content
элементы вычисляются в соответствии с их содержанием. Их расширение вычитается из расширения родительского контейнера. Мы позвоним оставшемусяexpansion_remainer
. Этот остаток распределяется междуfill_parent
элементами в соответствии с ихlayout_weight
.В-третьих, расширение каждого
fill_parent
элемента вычисляется как:Пример:
Если
weightSum
60, и есть 3fill_parent
элемента с весами 10, 20 и 30, их расширение на экране составляет 2/3, 1/3 и 0/3 родительского контейнера.Минимальное расширение ограничено 0. Максимальное расширение ограничено родительским размером, то есть веса ограничены 0.
Если для элемента установлено значение
wrap_content
, его расширение рассчитывается первым, а оставшееся расширение подлежит распределению междуfill_parent
элементами. ЕслиweightSum
установлено, это приводит кlayout_weight
отсутствию влияния наwrap_content
элементы. Тем не менее,wrap_content
элементы все еще могут быть вытолкнуты из видимой области элементами, вес которых меньше, чем (например, между 0-1 дляweightSum
= 1 или между 0-20 для приведенного выше примера).Если значение не
weightSum
указано, оно вычисляется как сумма всехlayout_weight
значений, включая элементы сwrap_content
множеством! Так чтоlayout_weight
настроившись наwrap_content
элементы, можете влиять на их расширение. Например, отрицательный вес сократит другиеfill_parent
элементы. Перед размещениемfill_parent
элементов будет ли применена вышеуказанная формула кwrap_content
элементам, причем максимально возможное расширение будет их расширением в соответствии с упакованным содержимым. Этиwrap_content
элементы будут усадка, а затем максимально возможное расширение для оставшихсяfill_parent
элементов вычисляются и распределено.Это может привести к неинтуитивным результатам.
источник
Если не указано, сумма вычисляется путем добавления layout_weight для всех дочерних элементов. Это можно использовать, например, чтобы дать одному ребенку 50% от общего доступного пространства, задав ему layout_weight 0,5 и установив weightSum равным 1,0. Должно быть значением с плавающей запятой, например, «1.2»
источник
Одна вещь, которая, кажется, больше никому не упоминалась: допустим, у вас есть вертикаль
LinearLayout
, поэтому, чтобы веса в компоновке / элементе / представлении внутри нее работали на 100% должным образом - все они должны иметьlayout_height
свойство (которое должно существовать в вашем XML файл)0dp
. Похоже, что любое другое значение может испортить ситуацию в некоторых случаях.источник
Макет Веса работает как соотношение. Например, если есть вертикальная компоновка и есть два элемента (например, кнопки или текстовые представления), один из которых имеет вес макета 2, а другой имеет вес 3 макета соответственно. Тогда 1-й элемент займет 2 из 5 частей экрана / макета, а другой - 3 из 5 частей. Здесь 5 - весовая сумма. т.е. сумма веса делит весь макет на определенные части. А вес макета определяет, какую долю занимает конкретный элемент из общей заранее определенной суммы веса. Весовая сумма также может быть указана вручную. Кнопки, текстовые представления, edittexts и т. Д. Все организованы с использованием веса и веса макета при использовании линейных макетов для дизайна пользовательского интерфейса.
источник
Из документации разработчика
Это может использоваться, например, чтобы дать одному дочернему
50%
элементу общего доступного пространства, присвоив ему layout_weight of0.5
и установив weightSum в1.0
.Дополнение к @Shubhayu ответу
Остальные
3/5
могут быть использованы для других дочерних макетов, которые действительно не нуждаются в какой-либо определенной части размещения макета.это потенциальное использование
android:weightSum
имущества.источник