【问题标题】:LinearLayout weights线性布局权重
【发布时间】:2013-02-07 04:55:19
【问题描述】:

我有两个宽度相同的线性布局 - 一个有两个孩子,一个有三个。我试图让最后两个孩子的宽度相同,但我无法理解为什么 Android 会这样。我终于用以下权重让它看起来像我想要的样子:

谁能向我解释为什么会这样?

我试着做一些简单的数学来找出原因。我猜这是重量的总和,减去孩子的重量,除以重量的总和,乘以父母的宽度。所以:

sum = 1 + 6
((sum - 6) / sum) * W = 14.3% * W

我为第二行尝试了相同的算法,但它完全关闭了:

sum = 1 + 1 + 1.5
((sum - 1.5) / sum) * W = 57.1% * W

更新

仅当子宽度设置为 match_parent 时,上述情况才成立。将宽度设置为 0 或 0dp,实际上表现如预期 - 更大的权重会导致为孩子分配更多的空间。该算法现在更有意义了,并且对两行都按预期工作。

sum = 1 + 6
(1 / sum) * W = 14.3% * W

对于权重的前一种行为,是否通过设计将子宽度设置为 match_parent?如果是这样,计算孩子宽度的近似算法是什么?

【问题讨论】:

    标签: android android-layout android-linearlayout


    【解决方案1】:

    您可以在 XML 中为您的 LinearLayout 指定 weightSum 属性,例如为您的第一个布局设置 1。那么你的前 2 个TextViews 会得到大约 0.9 和 0.1 的权重(比如 90% 和 10%)

    同样的事情需要应用于第二个LinearLayout。比如:

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:weightSum="1"
            android:background="#FF0000FF" >
    
            <TextView
                android:layout_width="0dip"
                android:layout_height="wrap_content"
                android:layout_weight=".9"
                android:layout_margin="3dp"
                android:background="#FFFFFFFF"
                android:text="TextView" />
    
            <TextView
                android:layout_width="0dip"
                android:layout_height="wrap_content"
                android:layout_weight=".1"
                android:layout_margin="3dp"
                android:background="#FFFFFFFF"
                android:text="TextView" />
        </LinearLayout>
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="3dp"
            android:weightSum="1"
            android:background="#FF0000FF" >
    
            <TextView
                android:layout_width="0dip"
                android:layout_height="wrap_content"
                android:layout_margin="3dp"
                android:layout_weight=".45"
                android:background="#FFFFFFFF"
                android:text="TextView" />
    
            <TextView
                android:layout_width="0dip"
                android:layout_height="wrap_content"
                android:layout_weight=".45"
                android:layout_margin="3dp"
                android:background="#FFFFFFFF"
                android:text="TextView" />
    
            <TextView
                android:layout_width="0dip"
                android:layout_height="wrap_content"
                android:layout_weight=".1"
                android:layout_margin="3dp"
                android:background="#FFFFFFFF"
                android:text="TextView" />
        </LinearLayout>
    

    顺便说一句,不要忘记将您的width 属性设置为0dip

    【讨论】:

      【解决方案2】:

      首先: 根据您的布局外观,您似乎希望使用 GridLayout 而不是两个 LinearLayout。

      回到你的问题: 在您的情况下,不要将我们的 layout_width 设置为 wrap_content(尤其是 match_parent!)。 将 layout_width 设置为 0dp,让 layout_weight 属性分配可用的水平空间。

      layout_weight 属性分配/添加 额外 空间到指定的 layout_width(或 layout_height 用于垂直方向的 LinearLayouts)。如果您只希望 layout_weight 为间距做出贡献,请将 layout_width 设置为 0dp(对于垂直方向的 LinearLayout,layout_height 设置为 0dp)。

      先试试这个,看看它的行为是否更符合您的期望。

      试试这个例子(网格比例为 3:3:1):

      <LinearLayout
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:background="#FF0000FF" >
      
          <TextView
              android:layout_width="0dp"
              android:layout_height="wrap_content"
              android:layout_weight="6"
              android:background="#FFFFFFFF"
              android:text="TextView" />
      
          <TextView
              android:layout_width="0dp"
              android:layout_height="wrap_content"
              android:layout_weight="1"
              android:background="#FFFFFFFF"
              android:text="TextView" />
      </LinearLayout>
      
      <LinearLayout
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:layout_marginTop="3dp"
          android:background="#FF0000FF" >
      
          <TextView
              android:layout_width="0dp"
              android:layout_height="wrap_content"
              android:layout_weight="3"
              android:background="#FFFFFFFF"
              android:text="TextView" />
      
          <TextView
              android:layout_width="0dp"
              android:layout_height="wrap_content"
              android:layout_weight="3"
              android:background="#FFFFFFFF"
              android:text="TextView" />
      
      <TextView
              android:layout_width="0dp"
              android:layout_height="wrap_content"
              android:layout_weight="1"
              android:background="#FFFFFFFF"
              android:text="TextView" />
      </LinearLayout>
      

      【讨论】:

      • 谢谢,这似乎有效。我尝试将 layout_width 设置为 0dp,现在它似乎很有意义。我正在以编程方式生成我的视图 - 将布局参数的宽度设置为 0 应该可以正常工作吗?
      • 是的,但是设置为 '0dp'(不要忘记 'dp',普通的 '0' 不起作用)。
      • 太棒了。将宽度设置为 0 确实 工作。 LayoutParams.weight 是浮点类型 - 大概 0dp 与 0 相同。无论如何,谢谢。现在权重按预期工作 - 权重越大,分配的空间越多。
      • 正确; layout_weight 接受浮点数,layout_width/layout_height 接受维度。
      • 我的意思是LayoutParams.width,它是一个整数。
      【解决方案3】:

      根据您的图片 - 重量不正确。例如,第一个“行”:您设置了第一个 TextView 的权重为“1”,第二个权重为“6”——这意味着第二个 TextView 将拥有更多空间——所有布局宽度的 6/7,而第一个 TextView 只有 1/7。为了简化计算,将总宽度想象为 100(%),并根据您想要给它们的比例在视图之间划分它们。

      【讨论】:

      • 您的假设是正确的,但行为与描述的完全相同。将权重设置为更高的值实际上会使视图缩小,我猜是因为宽度设置为 match_parent。
      • 正确。在水平线性布局中将 layout_width 设置为 match_parent 或在垂直线性布局中将 layout_height 设置为 match_parent 是不正确的(如果子视图必须与其他子视图相邻,它怎么能与其父视图一样宽)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-11
      • 2018-08-26
      相关资源
      最近更新 更多