What is android:weightSum in android, and how does it work?

前端 未结 9 728
梦毁少年i
梦毁少年i 2020-11-22 04:02

I want to know: What is android:weightSum and layout weight, and how do they work?

相关标签:
9条回答
  • 2020-11-22 04:03

    One thing which seems like no one else mentioned: let's say you have a vertical LinearLayout, so in order for the weights in layout/element/view inside it to work 100% properly - all of them must have layout_height property (which must exist in your xml file) set to 0dp. Seems like any other value would mess things up in some cases.

    0 讨论(0)
  • 2020-11-22 04:05

    Weight sum works exactly as you want (like other answers you don't have to sum all the weights on parent layout). On child view specify the weight you want it to take. Don't forget to specify

    android:layout_width="0dp" 
    

    Following is an example

        <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>
    

    This will look like

    0 讨论(0)
  • 2020-11-22 04:08

    The documentation says it best and includes an example, (highlighting mine).

    android:weightSum

    Defines the maximum weight sum. If unspecified, the sum is computed by adding the layout_weight of all of the children. This can be used for instance to give a single child 50% of the total available space by giving it a layout_weight of 0.5 and setting the weightSum to 1.0.

    So to correct superM's example, suppose you have a LinearLayout with horizontal orientation that contains two ImageViews and a TextView with. You define the TextView to have a fixed size, and you'd like the two ImageViews to take up the remaining space equally.

    To accomplish this, you would apply layout_weight 1 to each ImageView, none on the TextView, and a weightSum of 2.0 on the LinearLayout.

    0 讨论(0)
  • 2020-11-22 04:12

    Adding on to superM's and Jeff's answer,

    If there are 2 views in the LinearLayout, the first with a layout_weight of 1, the second with a layout_weight of 2 and no weightSum is specified, by default, the weightSum is calculated to be 3 (sum of the weights of the children) and the first view takes 1/3 of the space while the second takes 2/3.

    However, if we were to specify the weightSum as 5, the first would take 1/5th of the space while the second would take 2/5th. So a total of 3/5th of the space would be occupied by the layout keeping the rest empty.

    0 讨论(0)
  • 2020-11-22 04:15

    After some experimenting, I think the algorithm for LinearLayout is this:

    Assume that weightSum is set to a value. The case of absence is discussed later.

    First, divide the weightSum by the number of elements whith match_parent or fill_parent in the dimension of the LinearLayout (e.g. layout_width for orientation="horizontal"). We will call this value the weight multiplier w_m for each element. The default value for weightSum is 1.0, so the default weight multiplier is 1/n, where n is the number of fill_parent elements; wrap_content elements do not contribute to n.

    w_m = weightSum / #fill_parent

    E.g. when weightSum is 60, and there are 3 fill_parent elements, the weight multiplier is 20. The weight multiplier is the default value for e.g. layout_width if the attribute is absent.

    Second, the maximum possible expansion of every element is computed. First, the wrap_content elements are computed according to their contents. Their expansion is deducted from the expansion of the parent container. We will call the remainer expansion_remainer. This remainder is distributed among fill_parent elements according to their layout_weight.

    Third, the expansion of every fill_parent element is computed as:

    w_m - ( layout_weight / w_m ) * maximum_possible_expansion

    Example:

    If weightSum is 60, and there are 3 fill_parent elements with the weigths 10, 20 and 30, their expansion on the screen is 2/3, 1/3 and 0/3 of the parent container.

    weight | expansion
         0 | 3/3
        10 | 2/3
        20 | 1/3
        30 | 0/3
        40 | 0/3
    

    The minimum expansion is capped at 0. The maximum expansion is capped at parent size, i.e. weights are capped at 0.

    If an element is set to wrap_content, its expansion is calculated first, and the remaining expansion is subject to distribution among the fill_parent elements. If weightSum is set, this leads to layout_weight having no effect on wrap_content elements. However, wrap_content elements can still be pushed out of the visible area by elements whose weight is lower than weight multiplier (e.g. between 0-1 for weightSum= 1 or between 0-20 for the above example).

    If no weightSum is specified, it is computed as the sum of all layout_weight values, including elements with wrap_content set! So having layout_weight set on wrap_content elements, can influence their expansion. E.g. a negative weight will shrink the other fill_parent elements. Before the fill_parent elements are laid out, will the above formula be applied to wrap_content elements, with maximum possible expansion being their expansion according to the wrapped content. The wrap_content elements will be shrunk, and afterwards the maximum possible expansion for the remaining fill_parent elements is computed and distributed.

    This can lead to unintuitive results.

    0 讨论(0)
  • 2020-11-22 04:15

    From developer documentation

    This can be used for instance to give a single child 50% of the total available space by giving it a layout_weight of 0.5 and setting the weightSum to 1.0.

    Addition to @Shubhayu answer

    rest 3/5 can be used for other child layouts which really doesn't need any specific portion of containing layout.

    this is potential use of android:weightSum property.

    0 讨论(0)
提交回复
热议问题