Я хочу знать: что такое android: weightSum и вес макета, и как они работают?
Что такое android: weightSum в android и как он работает?
Ответ 1
В документации, android:weightSum
определяется максимальная сумма веса и рассчитывается как сумма layout_weight
всех дочерних элементов, если явно не указано.
Рассмотрим пример с a 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
полезен для правильного отображения макета для любого устройства, что не произойдет, если вы задаете ширину и высоту напрямую.
Ответ 2
Добавляя к ответам superM и Jeff,
Если в LinearLayout есть 2 вида, первый с макетом 1, второй с макетом размером 2 и без весаSum, по умолчанию значение weightSum вычисляется как 3 (сумма весов дети), а первый вид занимает 1/3 пробела, а второй - 2/3.
Однако, если бы мы должны были указать weightSum как 5, первое заняло бы 1/5 места, а второе заняло бы 2/5. Таким образом, в общей сложности 3/5 пространства будет занимать макет, оставаясь пустыми.
Ответ 3
Документация говорит об этом лучше всего и включает пример (выделение моего).
андроида: weightSum
Определяет максимальную сумму веса. Если не указано, сумма вычисляется по формуле добавив layout_weight всех детей. Это можно использовать для экземпляр, чтобы дать одиночному ребенку 50% от общего доступного пространства давая ему layout_weight 0.5 и устанавливая weightSum в 1.0.
Итак, чтобы исправить пример superM, предположим, что у вас есть LinearLayout
с горизонтальной ориентацией, которая содержит два ImageViews
и a TextView
с. Вы определяете TextView
для фиксированного размера, и вам бы хотелось, чтобы два ImageViews
занимали оставшееся пространство одинаково.
Чтобы выполнить это, вы применили бы layout_weight
1 к каждому ImageView
, ни один из TextView
и a weightSum
из 2.0 на LinearLayout
.
Ответ 4
После некоторых экспериментов я считаю, что алгоритм 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, и есть 3 fill_parent
элемента, весовой множитель равен 20. Множитель веса является значением по умолчанию, например. layout_width
, если атрибут отсутствует.
Во-вторых, вычисляется максимально возможное расширение каждого элемента. Сначала элементы wrap_content
вычисляются в соответствии с их содержимым. Их расширение вычитается из расширения родительского контейнера. Назовем остатком expansion_remainer
. Этот остаток распределяется среди элементов fill_parent
в соответствии с их layout_weight
.
В-третьих, разложение каждого элемента fill_parent
вычисляется как:
Пример:
Если weightSum
равно 60, и есть 3 fill_parent
элемента с весами 10, 20 и 30, их расширение на экране составляет 2/3, 1/3 и 0/3 родительского контейнера.
weight | expansion
0 | 3/3
10 | 2/3
20 | 1/3
30 | 0/3
40 | 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
set! Таким образом, наличие layout_weight
, установленное на элементах wrap_content
, может влиять на их расширение. Например. отрицательный вес уменьшит другие элементы fill_parent
.
Прежде чем элементы fill_parent
будут выложены, будет ли приведенная выше формула применена к элементам wrap_content
, причем максимально возможным расширением будет их расширение в соответствии с обернутым контентом. Элементы wrap_content
будут сокращены, а затем вычислено и распределено максимально возможное расширение для остальных элементов fill_parent
.
Это может привести к неинтуитивным результатам.
Ответ 5
Сумма веса работает точно так, как вы хотите (как и другие ответы, вам не нужно суммировать все веса на родительском макете). В представлении "ребенок" укажите вес, который вы хотите принять. Не забудьте указать
android:layout_width="0dp"
Ниже приведен пример
<LinearLayout
android:layout_width="500dp"
android:layout_height="20dp" >
<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="3"
android:background="@android:color/holo_green_light"
android:gravity="center"
android:text="30%"
android:textColor="@android:color/white" >
</TextView>
<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="2"
android:background="@android:color/holo_blue_bright"
android:gravity="center"
android:text="20%"
android:textColor="@android:color/white" >
</TextView>
<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="5"
android:background="@android:color/holo_orange_dark"
android:gravity="center"
android:text="50%"
android:textColor="@android:color/white" >
</TextView>
</LinearLayout>
Это будет выглядеть как
Ответ 6
Если не указано, сумма вычисляется путем добавления layout_weight всех дочерних элементов. Это может быть использовано, например, для того, чтобы дать одному ребенку 50% от общего доступного пространства, предоставив ему layout_weight 0.5 и установив weightSum равным 1.0. Должно быть значение с плавающей запятой, например "1.2"
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main_rel"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:weightSum="2.0" >
<RelativeLayout
android:id="@+id/child_one"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1.0"
android:background="#0000FF" >
</RelativeLayout>
<RelativeLayout
android:id="@+id/child_two"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1.0"
android:background="#00FF00" >
</RelativeLayout>
</LinearLayout>
Ответ 7
Одна вещь, которая больше не упоминается, скажем, у вас есть вертикальный LinearLayout
, поэтому для того, чтобы веса в макете/элементе/представлении внутри него работали на 100% все они должны иметь свойство layout_height
(которое должно существовать в вашем xml файле), установленное в 0dp
. Похоже, что любое другое значение в некоторых случаях будет испорчено.
Ответ 8
От разработчика документация
Это может быть использовано, например, для того, чтобы дать одному ребенку 50%
всего доступного пространства, присвоив ему layout_weight из 0.5
и установив weightSum в 1.0
.
Дополнение к ответу @Shubhayu
rest 3/5
может использоваться для других дочерних макетов, которые действительно не нуждаются в какой-либо определенной части содержащего макета.
это потенциальное использование свойства android:weightSum
.
Ответ 9
Макет Макет работает как отношение. Например, если есть вертикальный макет, и есть два элемента (например, кнопки или текстовые изображения), один из которых имеет макет 2, а другой - макет 3 соответственно. Затем первый элемент будет занимать 2 из 5 частей экрана/макета, а другой - 3 из 5 частей. Здесь 5 - весовая сумма. т.е. Весовая сумма делит весь макет на определенные части. И Макет Макет определяет, сколько частей занимает отдельный элемент из общей суммы сумм. Вес также может быть объявлен вручную. Кнопки, textviews, edittexts и т.д. Организованы с использованием веса и веса макета при использовании линейных макетов для дизайна пользовательского интерфейса.