3

我一直在玩弄 Android 布局,试图更好地理解权重,但我偶然发现了一个我无法解释的场景。我连续三个 UI 组件。一个权重为 1 且宽度为 wrap_content 的 LinearLayout(其中有一个按钮),后跟两个宽度为 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

4 回答 4

1

我不确定我是否可以清楚地解释为什么这不起作用,除非你使用weight那么你View应该有 a widthor heightof 0 取决于orientation它的父母。对不起,我更擅长举例而不是言语。但是,我可以告诉你,要达到你想要的效果,只需layout_weight从孩子身上取出属性LinearLayout,你就会得到想要的效果。

这将把它包装LinearLayout成它需要的东西,然后让两者Buttons平等地占据剩余的空间。试一试,你就会明白我的意思。我认为有一篇文章谈到了这一点。我会看看我能不能找到它。

<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"  // removed weight so the LL will just wrap the content
        android:background="@android:color/holo_blue_bright">

找到了

layout_weight文档的这一部分有一个你正在尝试做的例子。

于 2013-09-05T14:38:56.347 回答
1

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

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

我希望这是有道理的。不错的发现!

于 2013-09-05T15:49:16.597 回答
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 = "10" 那么整个屏幕可以分为 10 个部分,然后你可以layout_weight 根据需要使用

weight_sum

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

必须是浮点值,例如“1.2”。

 <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>

更多关注这个

你也可以参考这个

于 2013-09-05T14:33:21.680 回答
0

你需要定义

android:weightSum="" // 3 in your case

在你的外部 LinearLayout

于 2013-09-05T14:35:18.213 回答