Android 线性布局权重
我有两个宽度相同的线性布局——一个有两个孩子,一个有三个孩子。我试图让最后两个孩子的宽度相同,但我无法理解为什么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 -
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
,这是一个整数。您的假设是正确的,但是