android:layout_weight如何工作?

时间:2010-06-21 11:24:20

标签: android

当我有以下内容时,它显示四种颜色的顶部布局比底部布局区域的面积小得多。

根据this documentation,当您向layout_weight添加更多内容时,它应该会增加区域,但会在代码中减少。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

  <LinearLayout
      android:orientation="horizontal"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
      android:layout_weight="4">
      <TextView
          android:text="red"
          android:gravity="center_horizontal"
          android:background="#aa0000"
          android:layout_width="wrap_content"
          android:layout_height="fill_parent"
          android:layout_weight="3"/>
      <TextView
          android:text="green"
          android:gravity="center_horizontal"
          android:background="#00aa00"
          android:layout_width="wrap_content"
          android:layout_height="fill_parent"
          android:layout_weight="1"/>
      <TextView
          android:text="blue"
          android:gravity="center_horizontal"
          android:background="#0000aa"
          android:layout_width="wrap_content"
          android:layout_height="fill_parent"
          android:layout_weight="1"/>
      <TextView
          android:text="yellow"
          android:gravity="center_horizontal"
          android:background="#aaaa00"
          android:layout_width="wrap_content"
          android:layout_height="fill_parent"
          android:layout_weight="1"/>
  </LinearLayout>

  <LinearLayout
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_weight="1">
    <TextView
        android:text="row one"
        android:textSize="15pt"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"/>
    <TextView
        android:text="row two"
        android:textSize="15pt"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"/>
    <TextView
        android:text="row three"
        android:textSize="15pt"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"/>
    <TextView
        android:text="row four"
        android:textSize="15pt"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"/>
  </LinearLayout>

</LinearLayout>

8 个答案:

答案 0 :(得分:41)

我遇到了同样的问题。诀窍是不要对你要设置权重的控件使用“wrap_content”或“fill_parent”。而是将layout_height设置为0px(在垂直布局内),然后子控件将按权重值进行比例调整。

答案 1 :(得分:32)

如果您收到错误

错误

  

可疑大小:这会使视图隐藏,可能是预期的   布局......

记得在上面设置正确的参数 父母的android:orientation

答案 2 :(得分:10)

如果在LinearLayout中使用fill_parent,布局将占用尽可能多的空间,稍后定义的所有布局项将必须处理剩余的空间。

如果您将LinearLayouts的高度设置为wrap_content,则权重应按照文档记录。

答案 3 :(得分:9)

我知道这已经很晚了但希望能帮助别人:

在父级上使用android:weightSum。这是dev docs的链接。

http://developer.android.com/reference/android/widget/LinearLayout.html#attr_android:weightSum

在父级上使用android:weightSum 1.0,然后在0.x的子视图上使用android:layout_weight,以便他们使用该空间比率。

答案 4 :(得分:8)

在Janusz所说的基础上,如果你使用fill_parent,你可以设置android:layout_weight来“拆分”多个布局项之间的“完整区域”。

layout_weight不会增加区域,而是将其“右”增加到该区域。但它也与父母有关。如果您的父级布局为layout_height = fill_parent,且layout_weight = 0且父级的兄弟姐妹具有相同的兄弟,则将layout_weight = 1设置为其中一个子级不会影响父级。

父母和兄弟姐妹都会占用他们可以填补的可用区域的50%。

答案 5 :(得分:3)

解决方案是在使用layout_weight时将layout_height设置为0px。

但为什么你会观察到这种明显奇怪/倒置的行为?

短暂:剩下的空间是负数,因此体重4的孩子会得到更多的负空间,而且身高也会降低。

详情

假设父垂直布局的高度为100像素。

每个孩子的布局高度为fill_parent(即每个孩子的身高也是100像素)

所有孩子的总身高= 2 * 100像素

剩余高度= 100 - (2 * 100)= -100像素(为负

现在,让我们在孩子之间分配这个剩余的高度。第一个将获得最大的部分:80%(即-100 * 4 /(4 + 1))。第二个孩子收到20%(即-100 * 1 /(4 + 1))

现在计算得到的高度:

孩子1:100 +(-80)= 20px

孩子2:100 +( - 20)= 80px

这里没什么奇怪的,只有数学。请注意,剩余空间可能是负面的! (或者根据建议将高度明确设置为0)

答案 6 :(得分:1)

在线性布局属性中,将布局宽度更改为"fill_parent"而不是"wrap_content" 希望它有所帮助。

答案 7 :(得分:1)

如果linearlayout的方向是垂直的,则将layout_height设置为0dp。在水平布局的情况下,将layout_width设置为0dp。

如果我们不遵守上述规则,视图会根据指定的属性占用空间,因此对齐方式不符合预期。