Что такое android: weightSum в android и как он работает?

Я хочу знать: что такое android: weightSum и вес макета, и как они работают?

Ответ 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"). Мы будем называть это значение мультипликатором веса w_m для каждого элемента. Значение по умолчанию для weightSum равно 1.0, поэтому множитель веса по умолчанию 1/n, где n - количество элементов fill_parent; Элементы wrap_content не вносят вклад в n.

w_m = weightSum / #fill_parent

например. когда weightSum равно 60, и есть 3 fill_parent элемента, весовой множитель равен 20. Множитель веса является значением по умолчанию, например. layout_width, если атрибут отсутствует.

Во-вторых, вычисляется максимально возможное расширение каждого элемента. Сначала элементы wrap_content вычисляются в соответствии с их содержимым. Их расширение вычитается из расширения родительского контейнера. Назовем остатком expansion_remainer. Этот остаток распределяется среди элементов fill_parent в соответствии с их layout_weight.

В-третьих, разложение каждого элемента fill_parent вычисляется как:

w_m - ( layout_weight / w_m ) * maximum_possible_expansion

Пример:

Если 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 все еще могут вытесняться из видимой области элементами, вес которых ниже weight multiplier (например, между 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 и т.д. Организованы с использованием веса и веса макета при использовании линейных макетов для дизайна пользовательского интерфейса.