android:layout_weight是什么意思?

时间:2010-10-22 10:10:58

标签: android android-layout android-widget

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

13 个答案:

答案 0 :(得分:827)

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

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

答案 1 :(得分:237)

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

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

计算以分配子

之间的任何剩余空格

一般来说,公式是:

  

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

示例1

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

  

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

     

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

     

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

示例2

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

计算:

  

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

     

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

     

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

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

计算:

  

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

     

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

     

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


Source article

答案 2 :(得分:67)

添加其他答案,最重要的是让布局宽度(或高度)设置为0px

android:layout_width="0px"

否则你会看到垃圾

答案 3 :(得分:33)

如果有多个视图跨越LinearLayout,那么layout_weight会为每个视图提供一个比例大小。具有更大layout_weight值的视图“更重”,因此它获得更大的空间。

这是一张让事情更清晰的图片。

enter image description here

理论

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

enter image description here

布局重量相同。水平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答案,请参阅herehere。)

视图

水平LinearLayout中的每个视图都如下所示:

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

请注意,您需要layout_width="0dp"layout_weight="1"一起使用。忘记这会导致许多新用户出现问题。 (请参阅this article,了解通过不将宽度设置为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>

答案 4 :(得分:29)

layout_weight 告诉Android如何在View中分发您的LinearLayout。 Android然后首先计算指定权重的所有View所需的总比例,并根据它所指定的屏幕分数放置每个View。在以下示例中,Android看到TextView的{​​{1}} layout_weight(这是默认设置),0的{​​{1}}个EditText每个layout_weight,而2的权重为Button。因此Android分配“足够”的空间来显示1tvUsername,然后将屏幕宽度的剩余部分分成5个相等的部分,其中两个分配给tvPassword,两个分配给etUsername {1}}以及etPassword的最后一部分:

bLogin

看起来像:
landscape orientation
portrait orientation

答案 5 :(得分:15)

这样想,会更简单

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

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

方面,

答案 6 :(得分:10)

对我来说最好的解释之一是this one (from the Android tutorial, look for step 7)

  

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

     

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

答案 7 :(得分:6)

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

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

答案 8 :(得分:3)

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

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

答案 9 :(得分:2)

其他

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

android:layout_height="0dp"

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

android:layout_width="0dp"

答案 10 :(得分:0)

结合

的两个答案

Flo&amp; rptwsthi和roetzi,

请记住更改layout_width=0dp/px,否则layout_weight行为将反向行动,最大数字占据最小空间,最小数字占据最大空间。

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

小心这一点。

答案 11 :(得分:0)

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

答案 12 :(得分:-1)

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