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

时间:2011-09-17 05:48:21

标签: android android-layout android-layout-weight

我想知道:什么是android:weightSum和布局权重,它们是如何工作的?

10 个答案:

答案 0 :(得分:166)

添加到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,其余部分为空。

答案 1 :(得分:113)

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

让我们考虑一个示例,其中LinearLayout具有水平方向,其中包含3 ImageViews。现在我们希望这些ImageViews总是占用相同的空间。要实现此目的,您可以将每个layout_weight的{​​{1}}设置为1,并将ImageView计算为等于3,如评论中所示。

weightSum

<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"/> ..... 对于为任何设备正确呈现布局非常有用,如果直接设置宽度和高度,则不会发生这种情况。

答案 2 :(得分:23)

documentation说得最好并且包含一个例子,(突出我的)。

  

机器人:weightSum

     

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

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

要完成此操作,您需要对layout_weight申请ImageView 1,TextView申请{1}},weightSum申请LinearLayout

答案 3 :(得分:22)

权重和完全按照您的意愿工作(就像其他答案一样,您不必总结父布局上的所有权重)。在子视图上指定您想要的重量。 不要忘记指定

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>

这看起来像

enter image description here

答案 4 :(得分:19)

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

假设weightSum设置为值。稍后将讨论缺席的情况。

首先,将weightSum除以LinearLayout维度中match_parentfill_parent的元素数量(例如layout_widthorientation="horizontal")。我们将此值称为每个元素的权重乘数w_mweightSum的默认值为1.0,因此默认权重乘数为1/n,其中nfill_parent元素的数量; wrap_content个元素不会对n做出贡献。

w_m = weightSum / #fill_parent

E.g。当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_weightwrap_content元素没有影响。 但是,wrap_content个元素仍然可以被权重低于weight multiplier的元素推出可见区域(例如,weightSum = 1的0-1之间或0-20之间的元素上面的例子)。

如果未指定weightSum,则将其计算为所有layout_weight值的总和,包括元素并设置wrap_content!因此,layout_weight元素设置为wrap_content可以影响其扩展。例如。负权重会缩小其他fill_parent元素。 在fill_parent元素布局之前,上述公式是否会应用于wrap_content元素,最大可能的扩展是根据包装内容进行扩展。 wrap_content元素将被缩小,然后计算并分发剩余fill_parent元素的最大可能扩展。

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

答案 5 :(得分:9)

如果未指定,则通过添加所有子项的layout_weight来计算总和。例如,通过给予layout_weight为0.5并将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>

答案 6 :(得分:6)

似乎没有其他人提到的一件事:让我们说你有一个垂直 LinearLayout,所以为了布局中的权重/元素/视图里面的权重100%正确地工作 - 所有这些属性必须具有设置为layout_height 0dp 属性(必须存在于您的xml文件中)。在某些情况下,似乎任何其他值都会搞砸。

答案 7 :(得分:1)

来自开发者documentation

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

除了@Shubhayu回答

rest 3/5可用于其他子布局,这些布局实际上不需要包含布局的任何特定部分。

这是android:weightSum属性的潜在用途。

答案 8 :(得分:1)

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

答案 9 :(得分:0)

没有人明确提到 weightSumLinearLayout 的特定 XML 属性。

我相信这对那些一开始和我一样困惑、在 weightSum 文档中寻找 ConstraintLayout 的人会有帮助。