Android中的线性布局和重量

时间:2010-04-23 13:18:24

标签: android android-linearlayout android-layout-weight

我总是在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>

应该创建两个水平对齐的按钮,并平等地共享空间。问题是两个按钮不会增长以填充空间。

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

18 个答案:

答案 0 :(得分:653)

要记住的三件事:

  • 将孩子的 android:layout_width 设置为“0dp”
  • 设置父级的 android:weightSum 编辑:正如杰森摩尔所注意到的,这个属性是可选的,因为默认情况下它被设置为孩子们的layout_weight总和)
  • 按比例设置每个孩子的 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>

结果:

Layout weight example

答案 1 :(得分:147)

您没有设置layout_weight属性。您的代码为weight="1",内容为android:layout_weight="1"

答案 2 :(得分:51)

它是android:layout_weight。重量只能在LinearLayout中使用。如果linearlayout的方向为Vertical,则使用android:layout_height="0dp",如果方向为水平,则使用android:layout_width = "0dp"。它会完美运作。

答案 3 :(得分:21)

此图像总结了线性布局。

Linear Layout and Weight

您可以点击此链接获取有关该主题的更多信息。 Just Maths - Views, View Groups and Layouts

线性布局视频教程:宽度,高度和宽度权重

Android Linear Layout Tutorial

答案 4 :(得分:15)

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

答案 5 :(得分: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且第二个文本框的layout_weight为2,则剩余空间的三分之一将被赋予第一个,而三分之二将被赋予第二个(因为我们声称第二个更重要)。

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

答案 6 :(得分:6)

在按钮的宽度字段中,将wrap-content替换为0dp 使用视图的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比例,即空格将在按钮视图之间平均分配。

答案 7 :(得分:5)

@Manoj Seelan

的回答一样

android:layout_weight替换为android:weight

LinearLayout使用权重时。您必须在weightSum中添加LinearLayout,并根据LinearLayout的方向,您必须为所有0dp的儿童视图设置LinearLayout宽度/高度

示例:

如果 Linearlayout的方向为Vertical,则使用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>

答案 8 :(得分: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>

答案 9 :(得分:4)

也许将两个按钮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”。

答案 10 :(得分:2)

另外,您需要为android:layout_width="0dp"

的子视图[按钮视图]添加此LinerLayout

答案 11 :(得分:2)

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

答案 12 :(得分: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>

答案 13 :(得分:1)

你必须这样写它为我工作

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

答案 14 :(得分:1)

以下是代码中的更改(标记为 BOLD ):

<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",这意味着它将在水平方向(或宽度)上平均分割两个视图。

答案 15 :(得分: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>

答案 16 :(得分:0)

wrap_content代替fill_parent

答案 17 :(得分: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>

enter image description here