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

我想知道: 什么是机器人: 重量和布局重量,它们是如何工作的?

191065 次浏览

根据文档,android:weightSum定义了最大权重和,如果没有明确指定,则计算为所有子级的 layout_weight之和。

让我们考虑一个具有水平方向的 LinearLayout和内部的3个 ImageViews的例子。现在我们希望这些 ImageViews总是占用相同的空间。为了实现这一点,您可以将每个 ImageViewlayout_weight设置为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对于正确呈现任何设备的布局都很有用,如果直接设置宽度和高度,则不会出现这种情况。

文件说得最好,还包括一个例子(突出我的)。

机器人: 重量和

定义最大权重和。如果未指定,则使用 添加所有子级的 lay _ weight。这可以用于 实例为 单身子节点提供总可用空间的50% 赋予它一个布局权重0.5,并将 weightSum 设置为1.0。

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

为了实现这一点,您将对每个 ImageView应用 layout_weight1,对 TextView不应用 ImageView,对 LinearLayout应用 weightSum为2.0。

再加上 SuperM 和 Jeff 的回答,

如果在 LinearLayout 中有2个视图,第一个视图布局权重为1,第二个视图布局权重为2,并且没有指定 weightSum,默认情况下,weightSum 被计算为3(子视图的权重之和) ,第一个视图占用空间的1/3,而第二个视图占用空间的2/3。

但是,如果我们将重量和指定为5,那么第一个将占用空间的五分之一,而第二个将占用空间的五分之二。所以总共有五分之三的空间被保持其余空间的布局所占据。

如果未指定,则通过添加所有子级的 lay _ weight 来计算和。例如,可以使用这种方法为一个子空间提供总可用空间的50% ,方法是将 layfweight 设置为0.5,并将 weightSum 设置为1.0。必须是浮点值,如“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>

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

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

首先,将 weightSum除以线性布局维度中具有 match_parentfill_parent的元素的数目(例如,orientation="horizontal"layout_width)。我们将这个值称为每个元素的权重乘数 < img src = “ https://i.stack.imgur.com/dDgDu.gif”alt = “ w _ m”> 。weightSum的默认值是1.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。其余部分根据 layout_weight分布在 fill_parent元素中。

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

w_m - ( layout_weight / w_m ) * maximum_possible_expansion

例如:

如果 weightSum为60,并且有3个权重为10、20和30的 fill_parent元素,则它们在屏幕上的展开为父容器的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元素没有影响。 然而,重量小于 < img src = “ https://i.stack.imgur.com/dDgDu.gif”alt = “ weight multilier”> 的元素仍然可以将 wrap_content元素推出可见区域(例如,对于 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元素的最大可能展开。

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

有一件事似乎没有人提到: 假设你有一个 垂直的 LinearLayout,为了使它内部的布局/元素/视图的权重100% 正常工作-所有这些都必须有 layout_height属性(必须存在于 xml 文件中)设置为 0dp。在某些情况下,似乎任何其他值都会把事情搞砸。

来自开发商 文件

例如,可以使用这个函数给出总可用空间中的一个子 50%,方法是给它一个确定为 0.5的 lay _ weight,并将 weightSum 设置为 1.0

附加到@Shubhayu 回答

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

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

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

权重和的工作正如你想要的(像其他的答案,你不必总和所有的父布局的权重)。在子视图上指定要它承受的权重。别忘了说清楚

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

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

我相信这将有助于任何人谁是困惑的第一,因为我是,寻找 ConstraintLayout文档中的 weightSum