我想知道: 什么是机器人: 重量和布局重量,它们是如何工作的?
根据文档,android:weightSum定义了最大权重和,如果没有明确指定,则计算为所有子级的 layout_weight之和。
android:weightSum
layout_weight
让我们考虑一个具有水平方向的 LinearLayout和内部的3个 ImageViews的例子。现在我们希望这些 ImageViews总是占用相同的空间。为了实现这一点,您可以将每个 ImageView的 layout_weight设置为1,并且 weightSum将被计算为等于3,如注释中所示。
LinearLayout
ImageViews
ImageView
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"/> .....
weightSum对于正确呈现任何设备的布局都很有用,如果直接设置宽度和高度,则不会出现这种情况。
文件说得最好,还包括一个例子(突出我的)。
机器人: 重量和 定义最大权重和。如果未指定,则使用 添加所有子级的 lay _ weight。这可以用于 实例为 单身子节点提供总可用空间的50% 赋予它一个布局权重0.5,并将 weightSum 设置为1.0。
机器人: 重量和
定义最大权重和。如果未指定,则使用 添加所有子级的 lay _ weight。这可以用于 实例为 单身子节点提供总可用空间的50% 赋予它一个布局权重0.5,并将 weightSum 设置为1.0。
因此,为了更正 superM 的示例,假设您有一个水平方向的 LinearLayout,它包含两个 ImageViews和一个 TextView。您将 TextView定义为具有固定的大小,并且希望两个 ImageViews平等地占用剩余的空间。
TextView
为了实现这一点,您将对每个 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_parent或 fill_parent的元素的数目(例如,orientation="horizontal"的 layout_width)。我们将这个值称为每个元素的权重乘数 < img src = “ https://i.stack.imgur.com/dDgDu.gif”alt = “ w _ m”> 。weightSum的默认值是1.0,因此默认的权重乘数是 1/n,其中 n是 fill_parent元素的数量; wrap_content元素不会对 n产生影响。
match_parent
fill_parent
orientation="horizontal"
layout_width
1/n
n
wrap_content
例如,当 weightSum为60,有3个 fill_parent元素时,权重乘数为20。如果属性不存在,权重乘数就是例如 layout_width的默认值。
其次,计算每个单元的最大可能展开量。首先,根据 wrap_content元素的内容计算它们。它们的展开是从父容器的展开中扣除的。我们将调用其余的 expansion_remainer。其余部分根据 layout_weight分布在 fill_parent元素中。
expansion_remainer
第三,每个 fill_parent元素的展开式计算如下:
例如:
如果 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_weight对 wrap_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。在某些情况下,似乎任何其他值都会把事情搞砸。
layout_height
0dp
来自开发商 文件
例如,可以使用这个函数给出总可用空间中的一个子 50%,方法是给它一个确定为 0.5的 lay _ weight,并将 weightSum 设置为 1.0。
50%
0.5
1.0
附加到@Shubhayu 回答
Rest 3/5可以用于其他实际上不需要包含布局的任何特定部分的子布局。
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>
这看起来就像
没有人明确提到 weightSum是 LinearLayout的特定 XML 属性。
我相信这将有助于任何人谁是困惑的第一,因为我是,寻找 ConstraintLayout文档中的 weightSum。
ConstraintLayout