`
chriszeng87
  • 浏览: 738952 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android中的Layout_weight详解

阅读更多

转自: http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2012/1015/438.html

 

昨天code的时候发现listview挡住了下面的元素,看网上说给listview加上layout_weight可以解决问题,但是发现layout_weight用起来不是那么简单的。自己写代码测试也出来了不同的情况,最近看了一篇帖子感觉分析的很好,转贴出来学习下。

布局文件是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Button1"
/>
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="2"
android:text="Button2"
/>
</LinearLayout>

 

 

出现的布局是:button1占了2/3,button2占了1/3。


<ignore_js_op>

57e34f80d09736ec6d811907.jpg.png

 

 

<ignore_js_op style="font-family: Verdana, Helvetica; line-height: 28px;">


但是如果将布局文件中的button的属性android:layout_width="fill_parent"改为android:layout_width="wrap_content"那么出现的结果为:button1占了1/3,button2占了2/3。


<ignore_js_op>

3.png

 

 

<ignore_js_op style="font-family: Verdana, Helvetica; line-height: 28px;">


出现这样的结局是什么意思呢?下面是人家的详解:转载过来:

*******转载的解释*********
linearLayout中包含有weight的child时,linearLayout会measure两次:
设屏幕宽度为X
第一次:button1的measuredWidth为X,button2也为X (因为用了weight,所以linearLayout每次measure child时不考虑前一个已经占用的大小),total_width为2X
第二次:计算delta=x-total_width=-x,然后会将button1的宽度设为
x+delta*1/3=0.66x, button2的宽度为 x+delta*2/3=0.33x
那我现在对这句话重新概括一下:“因为设置了button1的权重最小,所以它占用的布局优先级就越高”,也许在Android里面布局并没有优先级之说,我这里只是为了说明问题,自己定义的,所以朋友们不要拍砖。
那首先分析一下當layout_width屬性設置為fill_parent的時候,即充滿父佈局,當然意思是這個控件要根據weight的設置盡可能的大,因此,依上例而論,button1的weight設為1,button2的weight設置為2.即button的優先級最高,因此,要填充父佈局就要button1先來填充,盡可能的大,那這個盡可能又是多少呢,這就要綜合layout裡其他控件的weight值了,然後做一下運算,button1佔據2/3,button2佔據1/3.你也可以把button2設置為一個非常大的數,比如2000,此時在Graphical Layout模式下可以看到button1填充滿了整個寬度,而看不到button2的影子,事實上button2還是存在的,你把鼠標指向button1的後面就可以看到一個長長的豎條,那個就是button2,已經非常非常小了。因此,在layout_width設置為fill_parent的時候,weight所代表的是你的控件要優先盡可能的大。

接著是當layout_weight設置為wrap_content的時候,即適應內容的寬度,意思是這個控件要盡可能的小,只要能把內容顯示出來就可以了,同樣的,如果把button1和button2的layout_weight設置為wrap_content後,button1的weight為1,button2的weight為2.那麼button1要優先盡可能的小,而button2也要盡可能的小,只是優先級不一樣,因為設置了weight,所以這兩個控件總的寬度要填滿父佈局的寬度,所以就又要計算每個控件所佔據的大小,此時,button1的優先級較高,共有兩份,一份1/3,一份2/3,button1要盡可能的小,那button1當然要選1/3,因此,我們看到的效果反而是button2佔據的較大。這裡要說的是如果把權值同樣做如下設置:button1為1,button2為2000,那button1是不是就要佔據1/2000的空間呢?這麼理解就錯了,剛才說了,要盡可能的小,但這個小是有一個限度的,那就是wrap_content,就是還要是內容完完整整的顯示出來,同樣的,盡可能的大也是有一個限度的,那就是父佈局的寬度。因此,在layout_width設置為wrap_content的時候,weight所代表的是你的控件要優先盡可能的大。
所以,要對weight做了解,要深深的理解下面兩句話:
在layout_width設置為fill_parent的時候,layout_weight所代表的是你的控件要優先盡可能的大,但這個大是有限度的,即fill_parent.
在layout_width設置為wrap_content的時候,layout_weight所代表的是你的控件要優先盡可能的小,但這個小是有限度的,即wrap_content.

layout_height 同 layout_width.



最后贴几张图出来:
1. layout_width="fill_parent", button1的weight=1,button2的weight=2;



 

<ignore_js_op style="font-family: Verdana, Helvetica; line-height: 28px;">

1.png

 

 




2.layout_width="fill_parent", button1的weight=1,button2的weight=2000;


<ignore_js_op>

2.png

 

 

<ignore_js_op style="font-family: Verdana, Helvetica; line-height: 28px;">




3.layout_width="wrap_content", button1的weight=1,button2的weight=2;



4.layout_width="wrap_content", button1的weight=1,button2的weight=2000;
<ignore_js_op>

4.png

分享到:
评论
2 楼 chriszeng87 2013-02-16  
jstl1point0 写道
android:layout_width = "0" 是关键

没太明白你的意思,你是说fill_parent的时候还是wrap_content的时候应该把android:layout_width设成0?
1 楼 jstl1point0 2013-02-15  
android:layout_width = "0" 是关键

相关推荐

    Android中的android:layout_weight使用详解

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

    Android_layout_详细介绍

    ### Android布局详解 在Android应用开发中,布局(Layout)是构建用户界面的关键组成部分,它决定了界面元素如何在屏幕上组织和排列。以下是对几种常见布局的深入解析: #### LinearLayout(线性布局) 线性布局...

    android线性布局详解.doc

    总之,Android线性布局通过`android:orientation`、`android:layout_gravity`、`android:gravity`和`android:layout_weight`这四个关键参数,提供了灵活的视图布局方式。理解这些参数的含义和用法对于构建高效的用户...

    Android 控件说明

    - `layout_weight`:用于确定视图在容器中的相对大小,特别是在`LinearLayout`中,当设置了`layout_weight`时,如果`layout_width`或`layout_height`设置为`match_parent`,则会根据权重分配空间。 - `layout_...

    Android六大布局详解

    例如,如果设置了`android:layout_width="0dp"`,则可以通过`android:layout_weight`属性来分配宽度。 示例代码: ```xml &lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:...

    Android Layout样式布局

    ### Android Layout样式布局详解 #### 一、概述 在Android应用开发中,界面设计是非常重要的一环,而界面设计的核心就是布局(Layout)。布局决定了应用界面的结构与外观,是用户体验好坏的重要因素之一。本文将...

    android studio 基本控件

    - 例如,如果有三个 TextView 设置了 `android:layout_weight="1"`、`android:layout_weight="2"` 和 `android:layout_weight="3"`,则这三个 TextView 将按比例占据 LinearLayout 的宽度(或高度,取决于 ...

    android UI界面设计

    - **android:layout_weight**:用于分配父布局中剩余空间的比例,与“wrap_content”搭配使用时,可以使子元素根据权重值动态分配空间。 - **android:layout_margin**:定义子元素边缘与其父布局边缘的间距。 #### ...

    制作一个简易的汇率转换app

    android:layout_weight="20" android:orientation="vertical"&gt; &lt;!-- 应用标题 --&gt; android:layout_width="fill_parent" android:layout_height="0dp" android:layout_weight="30" android:layout_...

    Android布局详解

    - `android:layout_weight`:控制子视图在可用空间中的分配比例。 **应用场景:** - 创建导航栏或工具栏。 - 构建列表或网格布局的基础结构。 - 布局简单且规则的应用界面。 **示例代码:** ```xml ...

    Layout_table android网格布局

    - **权重分配**:在TableRow中,可以使用`android:layout_weight`属性为控件分配权重,决定控件占据的列宽比例。 4. **Spanned Cells(跨列):** - 通过设置`android:layout_span`属性,可以让一个控件跨越多列...

    Android布局

    - **android:layout_weight**:用于描述子视图在剩余空间中所占的比例。例如,有两个子视图,一个设置了`android:layout_weight="1"`,另一个设置了`android:layout_weight="2"`,则第一个视图将获得剩余空间的1/3,...

    简易计算器

    在这个项目中,我们关注的焦点是处理除法操作时防止除数为0的情况,以及如何利用`android:layout_weight`属性来平衡组件在布局中的分布。 首先,让我们来探讨一下防止除数为0的问题。在数学中,除数为0是未定义的,...

    Android TabHost组件使用方法详解

    android:layout_weight="1" /&gt; ``` TabWidget是显示标签的地方,而FrameLayout用于填充每个标签页对应的内容。`layout_weight=1`设置使得内容区域占据剩余空间,确保了内容区域在屏幕上的适配。 接着,我们来...

    weight属性详解

    需要注意的是,`android:gravity`与`android:layout_gravity`是不同的属性,前者用于控制控件内部内容的对齐方式,后者则用于控制控件本身在父容器中的位置。 #### 三、weight属性详解 **1. weight属性的基本概念*...

    android布局属性详解

    例如,在一个水平LinearLayout中,如果有两个TextView,第一个TextView的`android:layout_weight="1"`,第二个TextView的`android:layout_weight="2"`,则第二个TextView将占据两倍于第一个TextView的空间。...

    LinearLayout的属性详解

    LinearLayout是Android开发中的基础布局组件,其主要通过orientation、layout_weight等属性来实现灵活的视图布局。理解并熟练运用这些属性,能够使你在开发过程中更高效地创建用户界面,满足各种设计需求。在实际...

    Android-Layouts

    ### Android Layouts详解 在Android应用开发中,布局(Layout)是组织用户界面的重要组成部分,它决定了应用界面的外观和结构。布局管理器用于控制视图(View)和视图组(ViewGroup)如何被放置在屏幕上。通过合理...

Global site tag (gtag.js) - Google Analytics