我不明白如何使用这个属性。谁能多告诉我一点吗?


当前回答

如果有多个视图跨越一个LinearLayout,那么layout_weight会给每个视图一个比例大小。layout_weight值越大的视图“权重”就越大,因此它得到的空间也就越大。

这里有一张图片让事情更清楚。

理论

布局权重一词与数学中的加权平均概念有关。这就像在大学课堂上,家庭作业占30%,出勤率占10%,期中考试占20%,期末考试占40%。这些部分的分数加在一起,就是你的总成绩。

布局重量也是一样的。水平线性布局中的每个视图可以占据总宽度的一定百分比。(或垂直线性布局高度的百分比。)

布局

你使用的LinearLayout看起来像这样:

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

    <!-- list of subviews -->

</LinearLayout>

注意,对于LinearLayout,你必须使用layout_width="match_parent"。如果您使用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"。忘记这一点会给许多新用户带来问题。(请参阅本文,了解不将宽度设置为0可以获得的不同结果。)如果你的视图是在垂直线性布局,那么你会使用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>

其他回答

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

线性布局支持为各个子节点分配权重。此属性为视图分配了一个“重要性”值,并允许它展开以填充父视图中的任何剩余空间。视图的默认权重为0。

计算子节点之间的剩余空间

一般情况下,公式为:

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

示例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)

如果第一个文本框的layout_weight为1,第二个文本框的layout_weight为2,那么剩余空间的三分之一将给第一个文本框,三分之二给第二个文本框(因为我们声称第二个文本框更重要)。

计算:

第一个标签= 0/(0+1+2) 第二个文本框= 1/(0+1+2) 第三个文本框= 2/(0+1+2)


文章来源

对我来说最好的解释之一是这个(来自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定义了控件相对于其他控件必须获得的空间大小。

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

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