android:layout_weight是什么意思?

What does android:layout_weight mean?

我不明白如何使用这个属性。 谁能告诉我更多关于它的事情?


使用layout_weight,您可以指定多个视图之间的大小比率。例如。你有一个MapView和一个table,它应该向地图显示一些额外的信息。地图应使用屏幕的3/4,表格应使用屏幕的1/4。然后,将maplayout_weight设置为3,将tablelayout_weight设置为1。

要使其工作,您还必须将高度或宽度(取决于您的方向)设置为0px。


简而言之,layout_weight指定布局中要分配给View的多少额外空间。

LinearLayout支持为各个孩子分配权重。此属性为视图指定"重要性"值,并允许它展开以填充父视图中的任何剩余空间。视图的默认权重为零。

计算以分配孩子之间的任何剩余空间

一般来说,公式是:

space assigned to child = (child's individual weight) / (sum of weight of every child in Linear Layout)

例1

如果有三个文本框,其中两个声明权重为1,而第三个没有权重(0),则剩余空间分配如下:

1st text box = 1/(1+1+0)

2nd text box = 1/(1+1+0)

3rd text box = 0/(1+1+0)

例2

假设我们在水平行中有一个文本标签和两个文本编辑元素。标签没有指定layout_weight,因此它占用了渲染所需的最小空间。如果两个文本编辑元素中的每一个的layout_weight都设置为1,则父布局中的剩余宽度将在它们之间平均分配(因为我们声称它们同样重要)。

计算:

1st label = 0/(0+1+1)

2nd text box = 1/(0+1+1)

3rd text box = 1/(0+1+1)

相反,如果第一个文本框的layout_weight为1,而第二个文本框的layout_weight为2,则剩余空间的三分之一将被赋予第一个,而三分之二将被赋予第二个文本框。 (因为我们声称第二个更重要)。

计算:

1st label = 0/(0+1+2)

2nd text box = 1/(0+1+2)

3rd text box = 2/(0+1+2)

来源文章


添加到其他答案,使这个工作最重要的是将布局宽度(或高度)设置为0px

1
android:layout_width="0px"

否则你会看到垃圾


如果有多个视图跨越LinearLayout,则layout_weight为每个视图提供一个比例大小。具有较大layout_weight值的视图"重量"更多,因此它获得更大的空间。

这是一个让事情更清晰的图像。

enter image description here

理论

术语布局权重与数学中加权平均的概念有关。就像在大学课堂上,作业价值30%,出勤率10%,期中价值20%,决赛价值40%。这些部分的分数在加权后会给出总分。

enter image description here

布局重量也是一样的。水平LinearLayout中的Views每个都占据总宽度的一定百分比。 (或垂直LinearLayout的高度的百分比。)

布局

您使用的LinearLayout将如下所示:

1
2
3
4
5
6
7
8
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <!-- list of subviews -->

</LinearLayout>

请注意,必须使用layout_width="match_parent"作为LinearLayout。如果您使用wrap_content,那么它将无法正常工作。另请注意,layout_weight不适用于RelativeLayouts中的视图(有关此问题的SO答案,请参阅此处和此处)。

观点

水平LinearLayout中的每个视图看起来像这样:

1
2
3
4
<Button
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1" />

请注意,您需要将layout_width="0dp"layout_weight="1"一起使用。忘记这会导致许多新用户出现问题。 (请参阅此文章,了解通过不将宽度设置为0可获得的不同结果。)如果您的视图位于垂直LinearLayout中,那么您当然会使用layout_height="0dp"

在上面的Button示例中,我将权重设置为1,但您可以使用任何数字。重要的只是总数。您可以在我发布的第一张图像中的三行按钮中看到,数字都不同,但由于比例相同,因此每行的加权宽度不会改变。有些人喜欢使用总和为1的十进制数,这样在复杂的布局中,每个部分的重量都很清楚。

最后一点说明。如果您有许多使用layout_weight的嵌套布局,则可能对性能有害。

额外

以下是顶部图像的xml布局:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="android:layout_weight="
        android:textSize="24sp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="1" />

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="2"
            android:text="2" />

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="1" />

    </LinearLayout>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="android:layout_weight="
        android:textSize="24sp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="10"
            android:text="10" />

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="20"
            android:text="20" />

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="10"
            android:text="10" />

    </LinearLayout>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="android:layout_weight="
        android:textSize="24sp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight=".25"
            android:text=".25" />

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight=".50"
            android:text=".50" />

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight=".25"
            android:text=".25" />

    </LinearLayout>

</LinearLayout>


layout_weight告诉Android如何在LinearLayout中分发View。 Android然后首先计算指定权重的所有View所需的总比例,并根据它指定所需的屏幕部分放置每个View。在下面的示例中,Android看到TextViewlayout_weight 0(这是默认值),EditText的每个layout_weight 2,而Button重量1。因此,Android分配"足够的"空间来显示tvUsernametvPassword,然后将屏幕宽度的剩余部分分成5个相等的部分,其中两个分配给etUsername,两个分配给etPassword,最后一部分到bLogin

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<LinearLayout android:orientation="horizontal" ...>

    <TextView android:id="@+id/tvUsername"
    android:text="Username"
    android:layout_width="wrap_content" ... />

    <EditText android:id="@+id/etUsername"
    android:layout_width="0dp"
    android:layout_weight="2" ... />

    <TextView android:id="@+id/tvPassword"
    android:text="Password"
    android:layout_width="wrap_content" />

    <EditText android:id="@+id/etPassword"
    android:layout_width="0dp"
    android:layout_weight="2" ... />

    <Button android:id="@+id/bLogin"
    android:layout_width="0dp"
    android:layout_weight="1"
    android:text="Login"... />

</LinearLayout>

看起来像:
landscape orientation

portrait orientation


这样想,会更简单

如果您有3个按钮,它们的权重相应为1,3,1,它将像HTML中的表格一样工作

为该线提供5个部分:按钮1的1个部分,按钮2的3个部分和按钮1的1个部分

看待,


对我来说最好的解释之一是这个(来自Android教程,寻找第7步):

layout_weight is used in LinearLayouts to assign"importance" to Views within the layout. All Views have a default layout_weight of zero, meaning they take up only as much room on the screen as they need to be displayed. Assigning a value higher than zero will split up the rest of the available space in the parent View, according to the value of each View's layout_weight and its ratio to the overall layout_weight specified in the current layout for this and other View elements.

To give an example: let's say we have a text label and two text edit elements in a horizontal row. The label has no layout_weight specified, so it takes up the minimum space required to render. If the layout_weight of each of the two text edit elements is set to 1, the remaining width in the parent layout will be split equally between them (because we claim they are equally important). If the first one has a layout_weight of 1 and the second has a layout_weight of 2, then one third of the remaining space will be given to the first, and two thirds to the second (because we claim the second one is more important).


http://developer.android.com/guide/topics/ui/layout-objects.html#linearlayout

layout_weight定义控件必须分别为其他控件获取多少空间。


请查看LinearLayout的weightSum和每个View的layout_weight。 android:weightSum ="4"android:layout_weight ="2"android:layout_weight ="2"他们的layout_height都是0px,但我不确定它是否相关

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:weightSum="4">

<fragment android:name="com.example.SettingFragment"
    android:id="@+id/settingFragment"
    android:layout_width="match_parent"
    android:layout_height="0px"
    android:layout_weight="2"
    />

<Button
    android:id="@+id/dummy_button"
    android:layout_width="match_parent"
    android:layout_height="0px"
    android:layout_weight="2"
    android:text="DUMMY"
    />
</LinearLayout>


额外的:

对于vertical方向,不要忘记将height设置为0dp

1
android:layout_height="0dp"

对于horizontal方向,不要忘记将width设置为0dp

1
android:layout_width="0dp"

添加android:autoSizeTextType="uniform"将自动为您调整文本大小


结合两个答案

Flo&amp; rptwsthi和roetzi,

记得改变你的layout_width=0dp/px,否则layout_weight行为将反向行动,最大数量占用最小空间,最小数量占据最大空间。

此外,一些权重组合会导致一些布局无法显示(因为它占据了空间)。

要小心这一点。


顾名思义,布局权重指定特定字段或窗口小部件占据屏幕空间的空间量或百分比。
如果我们在水平方向指定权重,那么我们必须指定layout_width = 0px
同样,如果我们在垂直方向指定权重,那么我们必须指定layout_height = 0px