为什么Android布局权重和wrap_content会提供比所需更多的空间?

时间:2013-09-05 14:20:29

标签: android android-layout layout

我在玩Android布局时试图更好地理解权重,我偶然发现了一个我无法解释的场景。我连续有三个UI组件。一个权重为1的LinearLayout和宽度为wrap_content(内部有一个按钮),后跟两个宽度为0dp且权重为1的按钮。我期待LinearLayout小于按钮的宽度但是当它是渲染后,LinearLayout占用了一半的空间,每个按钮占据了屏幕空间的四分之一。即使第一个按钮(在LinearLayout内部)比线性布局用完的空间小得多,也会发生这种情况。任何人都可以解释原因吗?

PS:如果你给LinearLayout宽度为0dp,权重为1,我知道这样可以正常工作(所有间隔均匀),但是想知道为什么这种情况会导致它出现这种情况。

<LinearLayout
        android:layout_width="match_parent"
        android:orientation="horizontal"
        android:layout_height="wrap_content">

    <LinearLayout
            android:layout_width="wrap_content"
            android:orientation="horizontal"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:background="@android:color/holo_blue_bright">
        <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="W =  1"/>
    </LinearLayout>

    <Button
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:text="W =  1"/>
    <Button
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:text="W =  1"/>
</LinearLayout>          

4 个答案:

答案 0 :(得分:0)

您正在为 LinearLayout 设置权重 所以它占用了所有空间

并且您没有为任何父

定义 weight_sum
 <LinearLayout
        android:layout_width="wrap_content"
            android:orientation="horizontal"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:background="@android:color/holo_blue_bright">
        <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="W =  1"/>
    </LinearLayout>

注意:

重量取决于屏幕的宽度/高度,而不是父母的宽度/高度 所以去除重量

如果设置weight_sum =&#34; 10&#34;然后整个屏幕可以分成10个部分,然后根据需要使用layout_weight

weight_sum

定义最大重量总和。如果未指定,则通过添加所有子项的layout_weight来计算总和。例如,通过为layout_weight设置0.5并将weightSum设置为1.0,可以使单个子项占总可用空间的50%。

必须是浮点值,例如&#34; 1.2&#34;。

 <LinearLayout
        android:layout_width="wrap_content"
            android:orientation="horizontal"
            android:layout_height="wrap_content"
            android:background="@android:color/holo_blue_bright">
        <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="W =  1"/>
    </LinearLayout>

了解更多关注this

您也可以参考this

答案 1 :(得分:0)

您需要定义

android:weightSum="" // 3 in your case
外部LinearLayout中的

答案 2 :(得分:0)

我不确定我是否可以清楚地解释为什么这不起作用,除非您使用weight,那么您的View应该有{{1} }或width为0,具体取决于其父级的height。对不起,我的例子比言语更好。但是,我可以告诉您,为了达到您想要的效果,只需从子orientation中取出layout_weight属性即可获得所需的效果。

这会将LinearLayout打包到它需要的内容,然后让两个LinearLayout平均占用剩下的空间。尝试一下,你会看到我的意思。我想有一篇文章谈到这一点。我会看看能不能找到它。

Buttons

找到它

layout_weight这部分文档中有一个例子,说明了你要做的事情。

答案 3 :(得分:0)

我认为你不需要像其他人所说的那样定义一个weightSum。

我测试了你的代码,事实上你发现的内容非常有趣。似乎正在发生的是内部LinearLayout首先使用wrap内容来获取其基本宽度,然后共享其自身与其他两个按钮之间的剩余宽度。因此,内部按钮很小(只使用其最小宽度),而LinearLayout的宽度等于小按钮+其他按钮之一。

我希望这是有道理的。很好的发现!