Android中的线性布局和权重


261

我总是在Android文档中读到这个有趣的体重值。现在,我想第一次尝试,但它根本没有用。

据我从文档中了解,此布局:

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

     <Button
        android:text="Register"
        android:id="@+id/register"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="10dip"
        weight="1" />

     <Button
        android:text="Not this time"
        android:id="@+id/cancel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="10dip"
        weight="1" />

  </LinearLayout>

应该创建两个水平对齐的按钮,并平均分配空间。问题在于这两个按钮没有增长来填充空间。

我希望按钮能够增长并填满整个生产线。如果两个按钮都设置为与父按钮匹配,则仅显示第一个按钮并填满整行。


更新:Android百分比支持也可以做到这一点。code2concept.blogspot.in/2015/08/…–
nitesh

Answers:



684

要记住的三件事:

  • 将孩子的android:layout_width设置为“ 0dp”
  • 设置父级的android:weightSum编辑:正如Jason Moore所注意到的,此属性是可选的,因为默认情况下它设置为子级的layout_weight sum)
  • 按比例设置每个子项的android:layout_weight(例如weightSum =“ 5”,三个子项:layout_weight =“ 1”,layout_weight =“ 3”,layout_weight =“ 1”)

例:

    <LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:weightSum="5">

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

    <Button
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="3"
        android:text="2" />

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

    </LinearLayout>

结果:

布局权重示例


66
感谢您提供有关将宽度设置为零的提示。我还发现不需要在父级上设置weightSum。
詹森·摩尔

30
很高兴知道,谢谢。如果是这样,当您不希望孩子填充父母的100%时,设置weightSum仍然有用。
Anke

13
这对于静态XML布局是正确的。如果要在运行时动态添加视图,addView(button, new LinearLayout.LayoutParams(0, height, 1));则即使使用正确的宽度和权重值对布局进行膨胀,也需要将addView与布局参数一起使用,例如true。
Nuthatch

您说设置父级的android:weightSum-将其设置为某个值或将其放入,应该如何设置?
theJerm,2012年

1
@batbrat是正确的,我正在动态生成UI。我有时将XML片段视为模板,然后在运行时进行修改或填充。在这种情况下,此技巧对我不起作用,我必须重新设置显式的宽度和重量才能使其正常工作。
Nuthatch 2014年

52

android:layout_weight。重量只能用于中LinearLayout。如果linearlayout的方向为垂直,则使用android:layout_height="0dp",如果方向为水平,则使用android:layout_width = "0dp"。它会完美地工作。



16

尝试将layout_width两个按钮的都设置为“ 0dip”,将weight两个按钮的都设置为0.5


现在两个按钮都从屏幕上消失了
Janusz

好的,然后将两者的布局宽度都设置为fill_parent并将权重设置为0.5
jqpubliq 2010年

看看这个这个。我对为什么仍然无法解决这个问题感到有些困惑,但是也许这会给您一些想法。
jqpubliq 2010年

7

LinearLayout支持为单个子项分配权重。此属性为视图分配一个“ 重要性 ”值,并允许其扩展以填充父视图中的所有剩余空间。默认权重为零

计算以在子级之间分配任何剩余/额外空间。(不是总空间)

分配给子项的空间=(子项单个权重)/(线性布局中每个子项的权重之和)

示例(1): 如果有三个文本框,其中两个文本框的权重为1,而第三个文本框的权重为(0),则将剩余/额外空间分配给

1st text box = 1/(1+1+0) 
2nd text box = 1/(1+1+0) 
3rd text box = 0/(1+1+0) 

示例(2):假设我们在水平行中有一个文本标签和两个文本编辑元素。标签未指定layout_weight,因此它占用呈现所需的最小空间。如果两个文本编辑元素的每个的layout_weight设置为1,则父布局中的剩余宽度将在它们之间平均分配(因为我们认为它们同等重要)。

calculation : 
1st label = 0/(0+1+1) 
2nd text box = 1/(0+1+1) 
3rd text box = 1/(0+1+1)

如果第一个文本框的layout_weight为1。更重要)。

calculation : 
1st label = 0/(0+1+2) 
2nd text box = 1/(0+1+2) 
3rd text box = 2/(0+1+2) 

7

在按钮的宽度字段中,替换wrap-content0dp
使用视图的layout_weight属性。

android:layout_width="0dp"  

这是您的代码的样子:

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

 <Button
    android:text="Register"
    android:id="@+id/register"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:padding="10dip"
    android:layout_weight="1" />

 <Button
    android:text="Not this time"
    android:id="@+id/cancel"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:padding="10dip"
    android:layout_weight="1" />    

</LinearLayout>

layout_weight用于将任何剩余空间按比例分配。在这种情况下,两个按钮的宽度为“ 0dp”。因此,剩余空间将在其中按1:1比例划分,即在按钮视图之间将均分。


6

就像@Manoj Seelan的答案

替换android:layout_weightandroid:weight

当您将Weight与配合使用时LinearLayout。你必须添加weightSumLinearLayout,并根据你的方向LinearLayout,你必须设置0dp所有的宽度/高度LinearLayout '的孩子意见

范例:

如果的方向LinearlayoutVertical,则设置所有LinearLayout子视图的宽度为0dp

 <LinearLayout
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:orientation="vertical"
     android:weightSum="3">

     <Button
        android:text="Register"
        android:id="@+id/register"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:padding="10dip"
        android:layout_weight="2" />

     <Button
        android:text="Not this time"
        android:id="@+id/cancel"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:padding="10dip"
        android:layout_weight="1" />

  </LinearLayout>

如果的方向Linearlayouthorizontal,则使用设置所有LinearLayout子视图的高度0dp

 <LinearLayout
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:orientation="horizontal"
     android:weightSum="3">

     <Button
        android:text="Register"
        android:id="@+id/register"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:padding="10dip"
        android:layout_weight="2" />

     <Button
        android:text="Not this time"
        android:id="@+id/cancel"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:padding="10dip"
        android:layout_weight="1" />

  </LinearLayout>

5

也许将两个按钮的layout_width属性都设置为“ fill_parent”可以解决问题。

我刚刚测试了这段代码,它可以在模拟器中运行:

<LinearLayout android:layout_width="fill_parent"
          android:layout_height="wrap_content">

    <Button android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="hello world"/>

    <Button android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="goodbye world"/>

</LinearLayout>

确保在两个按钮上将layout_width设置为“ fill_parent”。


1
这只会将右按钮推出屏幕,并且仅显示第一个按钮。
Janusz

4
<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/logonFormButtons"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:baselineAligned="true"       
        android:orientation="horizontal">

        <Button
            android:id="@+id/logonFormBTLogon"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"            
            android:text="@string/logon"
            android:layout_weight="0.5" />

        <Button
            android:id="@+id/logonFormBTCancel"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"            
            android:text="@string/cancel"
            android:layout_weight="0.5" />
    </LinearLayout>

现在,我建议使用layout_weight =“ 50”和layout_width =“ 0px”
2012年

2

在上述XML中,将android:layout_weight线性布局的设置为2android:layout_weight="2"


3
为什么需要那?为什么布局权重2很重要?为什么不20或200?
康拉德·弗里克斯

2

另外,您需要为此添加android:layout_width="0dp"子视图的[按钮视图]LinerLayout


2

你必须这样写它为我工作

<LinearLayout
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         android:orientation="horizontal"
            android:weightSum="2">

         <Button
            android:text="Register"
            android:id="@+id/register"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="10dip"
            android:layout_weight="1" />

         <Button
            android:text="Not this time"
            android:id="@+id/cancel"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="10dip"
            android:layout_weight="1" />

2

以下是代码中的更改(以粗体标记):

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

     <Button
        android:text="Register"
        android:id="@+id/register"
        android:layout_width="0dp" //changes made here
        android:layout_height="wrap_content"
        android:padding="10dip"
        android:layout_weight="1" /> //changes made here

     <Button
        android:text="Not this time"
        android:id="@+id/cancel"
        android:layout_width="0dp" //changes made here
        android:layout_height="wrap_content"
        android:padding="10dip"
        android:layout_weight="1" /> //changes made here

  </LinearLayout>

由于LinearLayout的水平方向为水平,因此您只需将宽度保持为0dp。在那个方向上使用重量。(如果您的方向是垂直的,则将高度保持为0dp)

由于有2个视图,并且已经android:layout_weight="1"为两个视图放置了,这意味着它将在水平方向(或宽度)上等分两个视图。


1
 <LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">

    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="2"
        android:text="Button 1" />

    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="3"
        android:text="Button 2" />

    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="2"
        android:text="Button 3" />

    </LinearLayout>

0

这是您问题的完美答案

  <LinearLayout 
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"
        android:orientation="horizontal"  >   
     <Button 
        android:text="Register" android:id="@+id/register"
        android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:padding="10dip" weight="1" />
     <Button 
        android:text="Not this time" android:id="@+id/cancel"
        android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:padding="10dip" weight="1" />
  </LinearLayout>

3
是“ weight”还是“ layout_weight”?
IgorGanapolsky '04年

这是android:layout_weight
Mahendra Gunawardena


0
 <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="center"
            android:background="#008">

            <RelativeLayout
                android:id="@+id/paneltamrin"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:gravity="center"

                >
                <Button
                    android:id="@+id/BtnT1"
                    android:layout_width="wrap_content"
                    android:layout_height="150dp"
                    android:drawableTop="@android:drawable/ic_menu_edit"
                    android:drawablePadding="6dp"
                    android:padding="15dp"
                    android:text="AndroidDhina"
                    android:textColor="#000"
                    android:textStyle="bold" />
            </RelativeLayout>

            <RelativeLayout
                android:id="@+id/paneltamrin2"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:gravity="center"
                >
                <Button
                    android:layout_width="wrap_content"
                    android:layout_height="150dp"
                     android:drawableTop="@android:drawable/ic_menu_edit"
                    android:drawablePadding="6dp"
                    android:padding="15dp"
                    android:text="AndroidDhina"
                    android:textColor="#000"
                    android:textStyle="bold" />

            </RelativeLayout>
        </LinearLayout>

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.