我想知道:什么是android:weightSum和布局权重,它们是如何工作的?
答案 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>
这看起来像
答案 4 :(得分:19)
经过一些实验,我认为LinearLayout的算法是这样的:
假设weightSum
设置为值。稍后将讨论缺席的情况。
首先,将weightSum
除以LinearLayout维度中match_parent
或fill_parent
的元素数量(例如layout_width
为orientation="horizontal"
)。我们将此值称为每个元素的权重乘数。 weightSum
的默认值为1.0,因此默认权重乘数为1/n
,其中n
是fill_parent
元素的数量; wrap_content
个元素不会对n
做出贡献。
E.g。当weightSum
为60且有3个fill_parent
元素时,权重乘数为20.权重乘数是例如...的默认值。如果属性不存在,则layout_width
。
其次,计算每个元素的最大可能扩展。首先,wrap_content
元素根据其内容计算。它们的扩展是从父容器的扩展中扣除的。我们将召集剩余的expansion_remainer
。此余数根据fill_parent
layout_weight
个元素中
第三,每个fill_parent
元素的扩展计算如下:
示例:
如果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
个元素仍然可以被权重低于的元素推出可见区域(例如,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)
没有人明确提到 weightSum
是 LinearLayout
的特定 XML 属性。
我相信这对那些一开始和我一样困惑、在 weightSum
文档中寻找 ConstraintLayout
的人会有帮助。