1

我有两个具有相同宽度的线性布局 - 一个有两个孩子,一个有三个。我试图让最后两个孩子的宽度相同,但我无法理解为什么 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?如果是这样,计算孩子宽度的近似算法是什么?

4

3 回答 3

1

第一:根据您的布局外观,您似乎想要使用 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>
于 2013-02-06T20:18:02.710 回答
1

您可以在 XML 中为您的第一个布局指定weightSum属性。然后你的前 2 个会得到大约 0.9 和 0.1 的权重(比如 90% 和 10%)LinearLayout1TextViews

同样的事情需要应用于第二个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

于 2013-02-06T20:16:32.250 回答
-1

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

于 2013-02-06T20:22:14.770 回答