android:layout_weight是什么意思?


Answers:


860

使用layout_weight可以指定多个视图之间的尺寸比例。例如,您有一个MapView和一个table应在地图上显示一些其他信息。地图应使用屏幕的3/4,表格应使用屏幕的1/4。然后你会设置layout_weightmap3和layout_weighttable1。

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


208
直到您提到0px高度为止!
JohnnyLambada 2012年

24
定义其中哪些将受体重影响。宽度或高度。
neteinstein 2014年

30
您确实需要0px。示例:您想要实现一个包含两个大小相等的列的表。每个表行都是具有两个“表单元格”(例如TextViews)的水平线性布局,每个表单元的layout_weight = .5。如果您在“表格单元格”上指定layout_width =“ wrap_content”,则内容宽度将添加到由layout_weight计算的宽度上,表格单元格的大小将全部不同,并且各列将无法正确对齐。因此,您必须设置layout_width = 0dp,以便android仅使用layout_weight来计算单元格的宽度。
eeeeaaii 2014年

3
@Solace,较晚的答案,但出于完整性考虑。.似乎weight属性对RelativeLayout没有帮助。它仅适用于LinearLayout。如果您认为需要重量,那么可能的方法是在RelativeLayout中创建LinearLayout(带有权重)。
bbv 2015年

1
layout_weight仅适用于线性布局,还是适用于每个视图组。
meShakti

247

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

LinearLayout支持为单个子项分配权重。此属性为视图分配“重要性”值,并允许其扩展以填充父视图中的所有剩余空间。视图的默认权重为零。

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

通常,公式为:

分配给孩子的空间=(孩子的体重)/(线性布局中每个孩子的体重之和)

例子1

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

第一个文本框= 1 /(1 + 1 + 0)

第二个文本框= 1 /(1 + 1 + 0)

第三个文本框= 0 /(1 + 1 + 0)

例子2

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

计算方式:

第一个标签= 0 /(0 + 1 + 1)

第二个文本框= 1 /(0 + 1 + 1)

第三个文本框= 1 /(0 + 1 + 1)

相反,如果第一个文本框的a layout_weight为1,第二个文本框的a layout_weight为2,则剩余空间的三分之一将分配给第一个,而第二个文本框将分配给第二个(因为我们主张第二个一个更重要)。

计算方式:

第一个标签= 0 /(0 + 1 + 2)

第二个文本框= 1 /(0 + 1 + 2)

第三个文本框= 2 /(0 + 1 + 2)


来源文章


19
比当前选择的答案更好的解释。
Shade 2012年

12
好吧,这里有简单的解释(我很欣赏)和简洁的细节(我以不同的方式欣赏)。他们都是很好的答案。
cbmanica 2012年

3
正如其他地方提到的,这android:layout_width="0px"一点很重要。同样,权重也不必是整数。
Brian White

这比所选答案更难理解,但是它给出了完整的答案-特别是当某些视图具有权重而有些视图没有权重时。这是一个巨大的用例,未包含在所选答案中。
阿西2014年

那么在哪里weightSum拍照呢?有什么关系layout_weight吗?
eRaisedToX

72

除了其他答案外,最重要的是将布局宽度(或高度)设置为0px

android:layout_width="0px"

否则你会看到垃圾


我认为这取决于您是要隐藏未定义其权重的视图,还是要显示其大小以适合其大小并将剩余的可用空间留给“加权”视图。
Andrea Leganza

如果我需要同时设置水平和垂直重量,该怎么办?
阿斯顿(Alston)

40

如果有多个视图跨越一个LinearLayout,则layout_weight给它们每个视图按比例缩放。具有较大layout_weight值的视图将“权重”更多,因此它具有更大的空间。

这是使情况更清晰的图像。

在此处输入图片说明

理论

术语布局权重与数学中的加权平均概念相关。就像在大学课堂上,功课占30%,出勤占10%,期中占20%,期末占40%。将这些部分的分数加在一起加权,即可得出总成绩。

在此处输入图片说明

布局权重相同。的Views在水平LinearLayout可各自占用的总宽度的某个百分比。(或垂直高度的百分比LinearLayout。)

布局

LinearLayout你使用会是这个样子:

<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如下所示:

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

请注意,您需要与layout_width="0dp"一起使用layout_weight="1"。忘记这一点会导致许多新用户出现问题。(如果不将width设置为0,则可获得不同的结果,请参见本文。)如果视图是垂直的, LinearLayout则可以使用layout_height="0dp"

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

最后一点。如果您使用了许多嵌套布局layout_weight,则可能会降低性能。

额外

这是顶部图像的xml布局:

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

1
我总是想知道为什么更多的人不发布图像来伴随他们的XML。了解视觉效果比编写代码容易得多。
AleksandrH,

30

layout_weight告诉Android如何在中分发您ViewLinearLayout。然后,Android首先计算View指定了权重的所有s 所需的总比例,并View根据其指定的屏幕比例来放置每个s 。在以下示例中,Android将所述TextView■找一个layout_weight0(这是默认值)和EditText■找一个layout_weight2每个,而Button具有的重量1。因此Android分配“刚够”的空间来显示tvUsernametvPassword然后将所述屏幕宽度的剩余部分分成5个等份,其中的两个被分配给etUsername,两etPassword和最后部分bLogin

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

它看起来像:
景观取向
纵向


链接不再可用。如果您还有其他参考,请更新。
BinaryGuy 2015年

16

这样想,会更简单

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

为该行提供5部分:1部分用于按钮1,3部分用于按钮2,1部分用于按钮1

看待,


10

对我来说最好的解释之一就是这个(从Android教程中查找步骤7)

在LinearLayouts中使用layout_weight为布局内的视图分配“重要性”。所有视图的默认layout_weight为零,这意味着它们仅占用屏幕上需要显示的空间。分配一个大于零的值将根据每个View的layout_weight的值及其与当前和为此View元素和其他View元素指定的总体layout_weight的比率,拆分父View的剩余可用空间。

举个例子:假设我们在水平行中有一个文本标签和两个文本编辑元素。标签未指定layout_weight,因此它占用了呈现所需的最小空间。如果两个文本编辑元素的每个的layout_weight设置为1,则父布局中的剩余宽度将在它们之间平均分配(因为我们认为它们同等重要)。如果第一个的layout_weight为1,第二个的layout_weight为2,则剩余空间的三分之一将分配给第一个,而第二个的三分之二将分配给第二个(因为我们声称第二个更为重要)。



4

额外

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

android:layout_height="0dp"

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

android:layout_width="0dp"

3

请查看LinearLayout的weightSum和每个View的layout_weight。android:weightSum =“ 4” android:layout_weight =“ 2” android:layout_weight =“ 2”它们的layout_height均为0px,但我不确定它是否是relevan

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

请查看LinearLayout的weightSum和每个View的layout_weight。android:weightSum =“ 4” android:layout_weight =“ 2” android:layout_weight =“ 2”它们的layout_height均为0px,但我不确定是否相关。
梁亮

0

结合两个答案

Flo&rptwsthi和roetzi,

请记住要更改您layout_width=0dp/pxlayout_weight行为,否则行为会反向发生,最大的数字占据最小的空间,最小的数字占据最大空间。

此外,某些权重组合将导致某些布局无法显示(因为它占用了过多的空间)。

当心这一点。



-1

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.