`
zyoo005
  • 浏览: 19148 次
  • 性别: Icon_minigender_1
  • 来自: 内蒙古
社区版块
存档分类
最新评论

Android的layout_weight属性释疑

阅读更多

 

Android的layout_weight属性释疑
转载

 

   layout_weight是LinearLayout布局里一个重要的属性,就像Qt里的stretch一样,把父视图剩余的空间分配给设 置了layout_weight的组件。这个属性可以让LinearLayout里不同的组件分配不同宽度/高度变得非常灵活。Android官网里对 layout_weight如下解释:

LinearLayout also supports assigning a weight to individual children. This attribute assigns an "importance" value to a view, and allows it to expand to fill any remaining space in the parent view. Child views can specify an integer weight value, and then any remaining space in the view group is assigned to children in the proportion of their declared weight. Default weight is zero. For example, if there are three text boxes and two of them declare a weight of 1, while the other is given no weight (0), the third text box without weight will not grow and will only occupy the area required by its content. The other two will expand equally to fill the space remaining after all three boxes are measured. If the third box is then given a weight of 2 (instead of 0), then it is now declared "more important" than both the others, so it gets half the total remaining space, while the first two share the rest equally.

    大意就是layout_weight的值越大,所占比例也越大。没错,这跟我们平常理解的stretch是一致的,但是如果把它理解成 layout_weight值相同则组件占用宽度或高度一致的话就错了,这里说的是布局完了之后的剩余空间如何分配,layout_weight相同只说 明剩余空间的分配大小相同,而组件的实际宽度/高度则是组件需要的空间加上layout_weight分配的空间。layout_weight的设置和 layout_height,layout_width不同的组合得出来不同的结果!

    且先看官网上关于LinearLayout的例子:

 

<?xml version="1.0"encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
   android:orientation="vertical"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent">

 <LinearLayout
     android:orientation="horizontal"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
     android:layout_weight="1">
     <TextView
         android:text="red"
         android:gravity="center_horizontal"
         android:background="#aa0000"
         android:layout_width="wrap_content"
         android:layout_height="fill_parent"
         android:layout_weight="1"/>
     <TextView
         android:text="green"
         android:gravity="center_horizontal"
         android:background="#00aa00"
         android:layout_width="wrap_content"
         android:layout_height="fill_parent"
         android:layout_weight="1"/>
     <TextView
         android:text="blue"
         android:gravity="center_horizontal"
         android:background="#0000aa"
         android:layout_width="wrap_content"
         android:layout_height="fill_parent"
         android:layout_weight="1"/>
     <TextView
         android:text="yellow"
         android:gravity="center_horizontal"
         android:background="#aaaa00"
         android:layout_width="wrap_content"
         android:layout_height="fill_parent"
         android:layout_weight="1"/>
 </LinearLayout>
        
 <LinearLayout
   android:orientation="vertical"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   android:layout_weight="1">
   <TextView
       android:text="row one"
       android:textSize="15pt"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:layout_weight="1"/>
   <TextView
       android:text="row two"
       android:textSize="15pt"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:layout_weight="1"/>
   <TextView
       android:text="row three"
       android:textSize="15pt"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:layout_weight="1"/>
   <TextView
       android:text="row four"
       android:textSize="15pt"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:layout_weight="1"/>
 </LinearLayout>
</LinearLayout>
 

 

  在2.2的模拟器上显示的结果如下:


各颜色条的宽度是不一致的,因为red,green,blue和yellow这几个字符串的长度不一样,如果将几个标签都改成test,则得到:

 

现在四个颜色条的宽度是相同的了,如果想既保持字符串不一致,又想得到相同宽度的颜色条:

把TextView中的属性android:layout_width值改为"fill_parent"

得到的结果似乎可以满足要求:

 


 

再这个基础上red颜色条的layout_weight设置为2。

 

红色颜色条彻底没了,对此不知道如何解释。如果layout_width是wrap_content的话则是正常的:

注意,这里几个颜色条的占用比例并不是2:1:1:1,原因之前说了。

利用嵌套的LinearLayout可以达到2:1:1:1的显示效果

 

<LinearLayout android:orientation="horizontal"
 android:layout_width="fill_parent" android:layout_height="fill_parent"
 android:layout_weight="1">
 <LinearLayout android:orientation="horizontal"
  android:layout_width="fill_parent" android:layout_height="fill_parent"
  android:layout_weight="3">
  <TextView android:text="red" android:gravity="center_horizontal"
   android:background="#aa0000" android:layout_width="fill_parent"
   android:layout_height="fill_parent" />
 </LinearLayout>
 <LinearLayout android:orientation="horizontal"
  android:layout_width="fill_parent" android:layout_height="fill_parent"
  android:layout_weight="2">
  <LinearLayout android:orientation="horizontal"
   android:layout_width="fill_parent" android:layout_height="fill_parent"
   android:layout_weight="1">
   <TextView android:text="green" android:gravity="center_horizontal"
    android:background="#00aa00" android:layout_width="fill_parent"
    android:layout_height="fill_parent" />
  </LinearLayout>
  <LinearLayout android:orientation="horizontal"
   android:layout_width="fill_parent" android:layout_height="fill_parent"
   android:layout_weight="1">
   <TextView android:text="blue" android:gravity="center_horizontal"
    android:background="#0000aa" android:layout_width="fill_parent"
    android:layout_height="fill_parent" />
  </LinearLayout>
  <LinearLayout android:orientation="horizontal"
   android:layout_width="fill_parent" android:layout_height="fill_parent"
   android:layout_weight="1">
   <TextView android:text="yellow" android:gravity="center_horizontal"
    android:background="#aaaa00" android:layout_width="fill_parent"
    android:layout_height="fill_parent" />
  </LinearLayout>
 </LinearLayout>
</LinearLayout>
 

 

再测试LinearLayout之间的layout_weight设置带来的影响,将第一个LinearLayout的layout_weight设置为2之后:



和view里的效果刚好相反,layout_weight大的LinearLayout占得比例最小,刚好成反比。不知道Google为什么要采用这样截然相反的策略。

 

最后总结一下吧:

1. LinearLayout内部的子控件之间的layout_weight是按照正比例分配空间

2. LinearLayout之间的layout_weight是按照反比例分配空间

3. 在Horizontal的LinearLayout中,控件A和控件B的layout_weight分别设置为2和1,并不代表两者的宽度之比为2:1。 控件的宽度等于空间本身需要的宽度,加上通过layout_weight设置分配到了父空间里的宽度。垂直方向的LinearLayout也同理。

4.要想实现控件A和控件B的宽度严格按比例显示,可以每个控件之上都添加一个LinearLayout,在LinearLayout的属性里设置layout_weight.

 

分享到:
评论

相关推荐

    2011.10.13(4)——— android android:layout_weight

    在Android开发中,`android:layout_weight`是一个非常重要的属性,尤其在布局管理器中,如LinearLayout。这个属性主要用于在有限的空间内分配组件的大小,根据权重比例来决定每个子视图占据的屏幕空间。本篇文章将...

    Android 五种Layout 布局

    android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"&gt; android:layout_width="wrap_content" android:layout_height="wrap_content" android:text=...

    Android应用中通过Layout_weight属性用ListView实现表格

    在Android应用开发中,`Layout_weight`属性是一个非常关键的概念,尤其在使用`LinearLayout`时。`Layout_weight`用于在`LinearLayout`中控制子视图(Views)如何平分剩余空间,这对于创建灵活且响应式的用户界面至关...

    androidlayout-marginBottom的值为负数.docx

    在Android布局设计中,`android:layout_margin`属性用于设置View与周围元素的边距,包括`android:layout_marginTop`、`android:layout_marginBottom`、`android:layout_marginLeft`和`android:layout_marginRight`。...

    Android中gravity与layout_gravity的区别

    Android 中的 gravity 和 layout_gravity 是两个常见的属性,它们都是用于设置视图组件的对齐方式,但是它们的作用域和应用场景却有所不同。 首先,让我们来看一下 gravity 属性。gravity 属性是用于设置视图组件...

    android_layout属性大全

    android_layout属性大全,包括layou的各种属性的汉语意思.方便查找对应个属性

    apktool layout_weight Base64

    2. Android布局系统中的layout_weight属性,以及如何通过设置权重来动态调整视图的大小。 3. Base64编码和解码的概念,以及在Android开发中的应用场景。 4. 如何使用Java内置的Base64工具进行编码和解码,或者如何在...

    Android layout_weight使用方法及实例

    在Android开发中,`layout_weight`属性是LinearLayout布局中的一个重要特性,它允许我们在有限的空间内按比例分配子视图的宽度或高度。`layout_weight`主要用于实现灵活的界面设计,尤其是在需要子视图等宽或者根据...

    Android中的android:layout_weight使用详解

    在Android开发中,`android:layout_weight`是一个关键属性,特别是在使用`LinearLayout`进行界面布局时。`layout_weight`用于指定一个子视图在父视图中的权重,它决定了控件如何分配额外的空间,尤其是在视图的尺寸...

    计算器(android)

    ntent" android:layout_height="wrap_content" android:layout_weight="1" android:text="/" /&gt; &lt;LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap...

    Android weight属性demo

    android:layout_weight="1" &lt;!-- 设置权重 --&gt; android:text="Button 1" /&gt; android:layout_width="0dp" &lt;!-- 同样设置为0dp --&gt; android:layout_height="wrap_content" android:layout_weight="2" &lt;!-- 更...

    layout_gravity和gravity区别以及应用

    在Android开发中,`layout_gravity`和`gravity`是两个关键属性,它们都与控件的对齐和定位有关,但应用场景和作用对象不同。本文将深入探讨这两个属性的区别,以及它们在实际开发中的应用。 首先,我们来了解`...

    Android_layout.rar_android_android 布局_layout

    关键属性有`orientation`(设置布局方向,可选垂直或水平)、`weight`(分配子视图的额外空间比例)以及`layout_gravity`(设置子视图在父视图中的位置)。 2. **RelativeLayout**:相对布局允许子视图相对于其他...

    Android移动开发-Weight计算.zip

    在Android移动开发中,"Weight"一词通常与布局管理器相关,特别是LinearLayout中的`layout_weight`属性。这个属性在创建动态、响应式界面时非常关键,因为它允许开发者分配视图组件之间的空间比例,而不仅仅是固定...

    Android_layout_详细介绍

    子控件可以通过设置`layout_weight`属性来控制在布局中的相对大小,实现灵活的控件宽度分配。例如,两个`TextView`控件,如果一个的`layout_weight`设为1,另一个设为2,则后者会占据更多的宽度。 - **对齐方式**:...

    Android布局文件的属性值解析

    `android:layout_weight` 属性用于分配视图在容器中剩余空间的比例。通常与 `match_parent` 配合使用来实现灵活的布局。例如: ```xml android:layout_width="match_parent" android:layout_height="wrap_...

    Android App中的多个LinearLayout嵌套布局实例解析

    查了下资料,说是要设置layout_weight属性 资料说得不是很清楚,也没仔细看,就去弄,结果越弄越混乱。 于是静下心来,自己写xml测试,发现如下。 如果LinearLayout是最外面的一层,它是不会弹出layout_weight属性的...

    weightDemo

    `layout_weight`属性是LinearLayout布局管理器的一个重要特性,用于在有限的空间内灵活分配子视图(View)的大小。本教程将深入探讨`layout_weight`属性,帮助你更好地理解和运用这一功能。 `layout_weight`属性在...

Global site tag (gtag.js) - Google Analytics