Android 线性布局权重

Android 线性布局权重,android,android-layout,android-linearlayout,Android,Android Layout,Android Linearlayout,我有两个宽度相同的线性布局——一个有两个孩子,一个有三个孩子。我试图让最后两个孩子的宽度相同,但我无法理解为什么Android会这样。我终于让它看起来像我想要的那样,重量如下: 谁能解释一下为什么会这样 我试着做一些简单的数学来找出原因。我猜是重量之和,减去孩子的重量,除以重量之和,乘以父母的宽度。因此: sum = 1 + 6 ((sum - 6) / sum) * W = 14.3% * W 我在第二行尝试了相同的算法,但完全失败了: sum = 1 + 1 + 1.5 ((sum -

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

谁能解释一下为什么会这样

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

sum = 1 + 6
((sum - 6) / sum) * W = 14.3% * W
我在第二行尝试了相同的算法,但完全失败了:

sum = 1 + 1 + 1.5
((sum - 1.5) / sum) * W = 57.1% * W
更新 仅当子宽度设置为与父宽度匹配时,上述情况才成立。将width设置为0或0dp,实际上会按照预期的方式运行-更大的权重会为子级分配更多的空间。该算法现在更有意义了,对这两行都能正常工作

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

子项宽度的权重的前一种行为是否设置为按设计匹配父项?如果是这样,计算子项宽度的近似算法是什么?

您可以为XML中的
线性布局指定
weightSum
属性,比如说为第一个布局指定
1
。然后,您的前两个
textview
将获得大约0.9和0.1的权重(比如90%和10%)

第二个
线性布局
也需要应用同样的方法。比如:

    <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
您可以在XML中为
LinearLayout
指定
weightSum
属性,比如说,为第一个布局指定
1
。然后,您的前两个
textview
将获得大约0.9和0.1的权重(比如90%和10%)

第二个
线性布局
也需要应用同样的方法。比如:

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

顺便说一句,别忘了先将
宽度属性设置为
0dip
: 根据布局的外观,您可能希望使用网格布局而不是两个线性布局

回到你的问题: 在您的案例中,不要将版面宽度设置为包裹内容(尤其是不匹配父项!)。 将layout_width设置为0dp,并让layout_weight属性分配可用的水平空间

“布局权重”属性将额外的空间分配/添加到指定的布局宽度(或垂直线性布局的布局高度)。如果只希望布局权重对间距有贡献,请将布局宽度设置为0dp(在垂直定向线性布局的情况下,布局高度设置为0dp)

首先尝试一下,看看这是否更符合您的期望

尝试此示例(其中栅格的比率为3:3:1):


首先: 根据布局的外观,您可能希望使用网格布局而不是两个线性布局

回到你的问题: 在您的案例中,不要将版面宽度设置为包裹内容(尤其是不匹配父项!)。 将layout_width设置为0dp,并让layout_weight属性分配可用的水平空间

“布局权重”属性将额外的空间分配/添加到指定的布局宽度(或垂直线性布局的布局高度)。如果只希望布局权重对间距有贡献,请将布局宽度设置为0dp(在垂直定向线性布局的情况下,布局高度设置为0dp)

首先尝试一下,看看这是否更符合您的期望

尝试此示例(其中栅格的比率为3:3:1):



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

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

谢谢,这似乎有效。我尝试将布局宽度设置为0dp,现在似乎有意义。不过,我是以编程方式生成视图的-将布局参数的宽度设置为0应该可以正常工作?是的,但是设置为“0dp”(不要忘记“dp”,普通的“0”不会工作)。太棒了。将宽度设置为0不起作用。
LayoutParams.weight
是一种浮动类型-推测0dp与0相同。无论如何,谢谢。现在权重按预期工作-权重越大,分配的空间就越多。正确;layout\u weight接受浮点数,layout\u width/layout\u height接受尺寸。我的意思是说
LayoutParams.width
,它是一个整数。谢谢,这似乎有效。我尝试将布局宽度设置为0dp,现在似乎有意义。不过,我是以编程方式生成视图的-将布局参数的宽度设置为0应该可以正常工作?是的,但是设置为“0dp”(不要忘记“dp”,普通的“0”不会工作)。太棒了。将宽度设置为0不起作用。
LayoutParams.weight
是一种浮动类型-推测0dp与0相同。无论如何,谢谢。现在权重按预期工作-权重越大,分配的空间就越多。正确;layout\u weight接受浮动,layout\u width/layout\u height接受尺寸。我的意思是说
LayoutParams.width
,这是一个整数。您的假设是正确的,但是