I want to know: What is android:weightSum and layout weight, and how do they work?
10 Answers
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.

- 13,402
- 5
- 33
- 30
-
2I was looking for the same, that what if weightsum is not defined and weights are provided to the child views. Your answer that it calculates own its own cleared everything – DeltaCap019 Sep 02 '14 at 11:23
-
Is it true that is recommended to use RelativeLayout than Layouts with weightSum? – Robert Jul 25 '15 at 17:07
Per documentation, android:weightSum
defines the maximum weight sum, and is calculated as the sum of the layout_weight
of all the children if not specified explicitly.
Let's consider an example with a LinearLayout
with horizontal orientation and 3 ImageViews
inside it. Now we want these ImageViews
always to take equal space. To acheive this, you can set the layout_weight
of each ImageView
to 1 and the weightSum
will be calculated to be equal to 3 as shown in the comment.
<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
is useful for having the layout rendered correctly for any device, which will not happen if you set width and height directly.

- 8,605
- 8
- 42
- 51
-
151This is not an explanation of the purpose of `weightSum`. The behavior in your example would be identical with `weightSum` omitted, and in fact weightSum should not be specified in that scenario. The [documentation](http://developer.android.com/reference/android/widget/LinearLayout.html#attr_android:weightSum) says, `weightSum Defines the maximum weight sum. If unspecified, the sum is computed by adding the layout_weight of all of the children.` – Jeff Axelrod Oct 04 '12 at 03:26
-
3@JeffAxelrod: It "should not" be specified? Why? I see no reason for that. So I would just say it does not need to be specified. – caw Feb 01 '13 at 11:03
-
19@MarcoW.: It should not be specified because of maintainability. As Jeff said, setting the weightSum to be equal to the sum of the weights inside the layout accomplishes nothing, but if someone changes it in the future it could cause headaches as now there is an unnecessary modifier to the layout that would have to be found and changed. This answer is incorrect and should not be the accepted answer. – d370urn3ur Sep 11 '13 at 12:33
-
4Don't see a good explanation of weightSum parameter, so from docs: "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." See http://developer.android.com/reference/android/widget/LinearLayout.html#attr_android:weightSum – Deepscorn Mar 13 '15 at 14:06
-
5The idea is that you can set weightSum to a number higher than the sum of the children. This causes the children to receive some but not all of the available extra space. In the example above, your single child would inherit half of the available space instead of all of it. – Edward Falk Oct 26 '15 at 23:52
-
Response 2 years late, but could it actually be more optimized to declare a weightSum even in the weight=1, =1, =1 scenario, given that the calculation of the totaling the child weights is done in advance? That width ratio result could be calculated in real time as the child views are being read through, without having to do any full passes through the child list beforehand. Of course having multiple connected values to coordinate during every code change impacts maintainability, but this seems like an O(1) solution for something previously O(n). – ogoldbart3 Aug 24 '17 at 19:26
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

- 1,876
- 3
- 24
- 50
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
.

- 27,676
- 31
- 147
- 246
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 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
.
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:
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 (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.

- 1,038
- 1
- 10
- 20
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. Must be a floating point value, such as "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>

- 3,946
- 39
- 35
-
'May be a floating point value, such as "1.2".' (https://developer.android.com/reference/android/widget/LinearLayout.html#attr_android:weightSum) – The incredible Jan Apr 11 '17 at 08:37
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.

- 1,925
- 2
- 22
- 53
-
1android:layout_width="match_parent" is usually used instead of 0dp – kc ochibili Apr 17 '15 at 16:16
-
why is that so? I mean you are right it is messing up, but setting height to 0 dp fied my problem. i would to know the reason. – Abdul Waheed Nov 19 '16 at 07:14
Layout Weight works like a ratio. For example, if there is a vertical layout and there are two items(such as buttons or textviews), one having layout weight 2 and the other having layout weight 3 respectively. Then the 1st item will occupy 2 out of 5 portion of the screen/layout and the other one 3 out of 5 portion. Here 5 is the weight sum. i.e. Weight sum divides the whole layout into defined portions. And Layout Weight defines how much portion does the particular item occupies out of the total Weight Sum pre-defined. Weight sum can be manually declared as well. Buttons, textviews, edittexts etc all are organized using weightsum and layout weight when using linear layouts for UI design.

- 151
- 2
- 9
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.

- 4,537
- 2
- 25
- 34
No one has explicitly mentioned that weightSum
is a particular XML attribute for LinearLayout
.
I believe this would be helpful to anyone who was confused at first as I was, looking for weightSum
in the ConstraintLayout
documentation.

- 669
- 2
- 8
- 23

- 121
- 7