android中的android:weightSum是什么,它如何工作?


Answers:


132

根据文档,android:weightSum定义最大重量总和,layout_weight如果未明确指定,则计算为所有子项的总和。

让我们考虑一个LinearLayout水平方向为3 的示例ImageViews。现在我们希望它们ImageViews始终占据相等的空间。为此,您可以将layout_weight每个设置ImageView为1,然后weightSum将其计算为等于3,如注释所示。

<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 对于正确地为任何设备渲染布局很有用,如果直接设置宽度和高度,则不会发生这种情况。


145
这不是对的目的的解释weightSum。您的示例中的行为与weightSum省略的行为相同,并且实际上不应在该情况下指定weightSum。该文档说,weightSum Defines the maximum weight sum. If unspecified, the sum is computed by adding the layout_weight of all of the children.
Jeff Axelrod

3
@JeffAxelrod:“不应该”指定吗?为什么?我认为没有理由。因此,我只是说不需要指定它。
caw

17
@MarcoW .:由于可维护性,不应指定它。正如Jeff所说,将weightSum设置为等于版面内的权重之和没有任何作用,但是如果将来有人更改它,可能会引起麻烦,因为现在必须找到版面的不必要修饰符并改变了。该答案是错误的,不应被接受。
d370urn3ur 2013年

3
没有看到关于weightSum参数的很好的解释,因此从docs中可以得出以下结论:“例如,可以通过给它一个layout_weight为0.5并将weightSum设置为1.0来给单个孩子提供总可用空间的50%。” 见developer.android.com/reference/android/widget/...
Deepscorn

5
这个想法是,您可以将weightSum设置为一个高于子级和的数字。这会使孩子们收到一些但不是全部可用的额外空间。在上面的示例中,您的独生子将继承可用空间的一半,而不是全部。
爱德华·福尔克

175

加上superM和Jeff的答案,

如果LinearLayout中有2个视图,则第一个视图的layout_weight为1,第二个视图的layout_weight为2,并且未指定weightSum,默认情况下,weightSum计算为3(子项的权重之和),并且第一个视图占据了1/3的空间,第二个视图则占据了2/3的空间。

但是,如果将weightSum指定为5,则第一个将占空间的1/5,而第二个将占2/5。因此,布局将占用总共3/5的空间,其余空间则为空。


2
我一直在寻找相同的东西,如果未定义weightsum并将权重提供给子视图怎么办。您的答案是自己计算的,清除了所有内容
DeltaCap019 2014年

是否建议使用RelativeLayout而不是具有weightSum的Layout?
罗伯特

26

权重总和可以完全按照您的要求工作(就像其他答案一样,您不必对父级布局中的所有权重求和)。在子视图上,指定您要承受的重量。不要忘记指定

android:layout_width="0dp" 

以下是一个例子

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

这看起来像

在此处输入图片说明


25

文档说得最好,并提供了一个示例(突出说明)。

android:weightSum

定义最大重量总和。如果未指定,则通过将所有子项的layout_weight相加来计算总和。例如,可以通过给它一个0.5的layout_weight并将weightSum设置为1.0 来给单个孩子提供总可用空间的50%。

因此,要纠正superM的示例,假设您的LinearLayout水平方向包含两个ImageViews和一个TextViewwith。您将定义TextView为具有固定大小,并希望两者均等ImageViews地占用剩余空间。

为此,您需要layout_weight对分别应用1 ImageView,对不应用TextViewweightSum对应用2.0 LinearLayout


20

经过一些实验,我认为LinearLayout的算法是这样的:

假设将weightSum其设置为一个值。缺席的情况将在后面讨论。

首先,分割weightSum由蒙山元件的数量match_parentfill_parent在的LinearLayout的尺寸(例如layout_widthorientation="horizontal")。我们将此值称为w_m每个元素的权重乘数。的默认值为weightSum1.0,因此默认的权重乘数为1/n,其中nfill_parent元素数;wrap_content元素没有贡献n

w_m = weightSum / #fill_parent

例如,当weightSum为60且有3个fill_parent元素时,权重乘数为20。权重乘数是默认值,例如,layout_width如果缺少该属性。

其次,计算每个元素的最大可能扩展。首先,根据wrap_content元素的内容计算元素。它们的扩展从父容器的扩展中扣除。我们将称为余数expansion_remainer。该剩余部分fill_parent根据其元素在元素之间分配layout_weight

第三,每个fill_parent元素的扩展计算如下:

w_m-(layout_weight / w_m)* maximum_possible_expansion

例:

如果 weightSum为60,并且有3个fill_parent元素的权重为10、20和30,则它们在屏幕上的扩展为父容器的2 / 3、1 / 3和0/3。

weight | expansion
     0 | 3/3
    10 | 2/3
    20 | 1/3
    30 | 0/3
    40 | 0/3

最小扩展上限为0。最大扩展上限为父级尺寸,即权重上限为0。

如果将元素设置为wrap_content,则首先计算其扩展,其余扩展受fill_parent元素之间的分配影响。如果weightSum设置为layout_weight,则不会影响wrap_content元素。但是,wrap_content仍可以通过重量小于这些元素的元素将元素推出可见区域权重乘数(例如,对于0-1,在0-1 weightSum之间;对于上面的示例,在0-20之间)。

如果未weightSum指定,则将其计算为所有layout_weight值的总和,包括带有wrap_contentset的元素!因此layout_weight设置wrap_content元素可以影响它们的扩展。例如负的重量会收缩其他fill_parent元素。在fill_parent元素布局之前,将上述公式应用于wrap_content元素,最大可能的扩展是根据包装内容的扩展。的wrap_content元件将被收缩,事后对剩余的最大可能膨胀fill_parent元件被计算和分配。

这可能会导致不直观的结果。


10

如果未指定,则通过将所有子项的layout_weight相加来计算总和。例如,可以通过给它一个0.5的layout_weight并将weightSum设置为1.0来给单个孩子提供总可用空间的50%。必须为浮点值,例如“ 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>

“可能是浮点值,例如“ 1.2”。(developer.android.com/reference/android/widget/...
令人难以置信的一月

6

似乎没有其他人提到的一件事:假设您有一个vertical LinearLayout,所以为了使其中的layout / element / view中的权重能够正常工作100%-所有这些都必须具有layout_height属性(该属性必须存在于xml中)文件)设置为0dp。在某些情况下,似乎其他任何值都会使事情变得混乱。


1
机器人:layout_width = “match_parent”通常用来0dp代替
KC ochibili

为什么呢?我的意思是您说的没错,但是将高度设置为0 dp解决了我的问题。我想知道原因。
Abdul Waheed

2

布局权重就像一个比率。例如,如果有一个垂直布局,并且有两个项目(例如按钮或文本视图),一个项目的布局权重为2,另一个项目的布局权重为3。然后,第一个项目将占据屏幕/布局的5个部分中的2个,而另一个占5个部分的3个。这里5是权重之和。即,权重总和将整个布局划分为定义的部分。 布局权重定义特定项目在预定义的总权重总和中占多少部分。重量总和也可以手动声明。当使用线性布局进行UI设计时,按钮,文本视图,编辑文本等全部使用权重和布局权重进行组织。


1

从开发人员文档

例如,50%可以通过给它一个layout_weight 0.5并将weightSum设置为来给单个孩子提供总可用空间1.0

除了@Shubhayu答案

rest 3/5可以用于其他真正不需要包含布局的任何特定子布局的子布局。

这是android:weightSum财产的潜在用途。

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.