【转】安卓布局:layout_weight的理解

android:layout_weight详细分析介绍:

布局文件是:
<?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。

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

出现这样的结局是什么意思呢?下面是详细解释:

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的权重最小,所以它占用的布局优先级就越高”,也就是说layout_weight越小,布局优先级越高。也许在Android里面布局并没有优先级之说,我这里只是为了说明问题,自己定义的,所以朋友们不要拍砖。
      那首先分析一下当layout_width属性设置为fill_parent的时候,即充满父布局,当然意思是这个控件要根据weight的设置尽可能的大,因此,依上例而论,button1的weight设为1,button2的weight设置为2.即button1的优先级最高,因此,要填充父布局就要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.

实际上上面做的解释主要是对fill_parent和wrap_content做的解释,我们可以参考下面的2篇博文知道,上面的解释是存在一定的问题的。

一般来说,我们使用layout_weight,我们可能会使用在各个控件或者布局(像LinearLayout),应用最广泛的就是DV6300-T的主界面的布局,全部用的是layout_weight来控制的,这样可以更好的适应不同的分辨率。

所以我们经常用layout_weight来设置布局,一般是设置不同的LinearLayout为不同的layout_weight来完成基本布局,还可以利用LinearLayout来占据空间都是没有任何显示,这样的就是完全实现比重布局的LinearLayout,最后在各个LinearLayout里面又实现多个控件的layout_weight控制,同样也可以使用只占控件无显示的控件来达到分配布局的效果,DV6300-T就是明显例子。

还需要注意的就是LinearLayout的orientation如果没有设置,那么默认的就是horizontal水平方向。

按比例显示LinearLayout内各个子控件,需设置android:layout_width="0dp",

如果为竖直方向的设置android:layout_height="0dp"。

在这种情况下某子个控件占用LinearLayout的比例为:本控件weight值 / LinearLayout内所有控件的weight值的和。

一般我们控制比重都是设置对应方向的高或宽为0dp来实现我们想的比重控制,而很少用fill_parent或wrap_content,不过我们来理解这2种设置的区别。

还有一句话需要理解就是: 权重(layout_weight)最小,所以它占用的布局优先级就越高。

还需要注意的是保存一致性控制

如果我们要控制显示比重,那么我们一般要求各个等级的元素的控制方式必须一致,比如多个button控件处于同一等级来控制比重布局,那么如果设置的是android:layout_width="0dp"这样的方式来控制,就必须把所有的等级控件都用android:layout_width="0dp"来控制,而不能有的用android:layout_width="0dp",而还有的用android:layout_width=" fill_parent ",这样就会出现混乱了。

下面还有一个例子:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent">

<LinearLayout

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:layout_weight="1">

<Button

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:layout_weight="2"

android:background="#00AAC0"

/>

<Button

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:layout_weight="2"

android:background="#CCdd00"

/>

<Button

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:layout_weight="1"

android:background="#0000FF"

/>

</LinearLayout>

<LinearLayout

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:layout_weight="2">

<Button

android:layout_width="wrap_content"

android:layout_height="fill_parent"

android:layout_weight="2"

android:background="#FFAA00"

/>

<Button

android:layout_width="wrap_content"

android:layout_height="fill_parent"

android:layout_weight="2"

android:background="#CCdd00"

/>

<Button

android:layout_width="wrap_content"

android:layout_height="fill_parent"

android:layout_weight="1"

android:background="#0000FF"

/>

</LinearLayout>

<LinearLayout

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:layout_weight="2">

<Button

android:layout_width="0dp"

android:layout_height="fill_parent"

android:layout_weight="2"

android:background="#00FF00"

/>

<Button

android:layout_width="0dp"

android:layout_height="fill_parent"

android:layout_weight="2"

android:background="#CCdd00"

/>

<Button

android:layout_width="0dp"

android:layout_height="fill_parent"

android:layout_weight="1"

android:background="#cc00FF"

/>

</LinearLayout>

</LinearLayout>

看看最后的效果图:

时间: 2024-10-10 13:39:00

【转】安卓布局:layout_weight的理解的相关文章

Android实习收获:UI细节bug引发的layout_weight深入理解

今天在修改一个布局问题时候,发现自己对权重的理解还不够. 首先问题如图: 一个TextView没有按要求显示完整,显示成了2行. 怎么办呢? 方法1:是把它左面的字体放小. 结果师兄说不可以随意修改布局的尺寸,否则测试还会提bug. 方法2:不让改字体,那就修改边距,图片的margin,textView的magin,统统改了遍. 结果可想而知,这么大的变动更不可以. 师兄看我这么愚钝,指点了一下:不修改布局,怎样能让时间不论在什么情况下都显示呢? 我的做法: <TextView android:

安卓布局修改基础常识篇之TextView属性

[天使]安卓布局修改基础常识篇之TextView属性 在修改布局xml文件时需要熟练掌握一些属性,以下是TextView也就是文本的属性:android:autoLink 是否自动链接网址或邮箱地址:android:autoText 自动检测错误:android:bufferType 决定getText()返回的类型android:capitalize 指定使用类型android:cursorVisible 光标是否可见android:digits 数字输入android:drawableBot

【转】android中layout_weight的理解

android Layout_weight的理解 SDK中的解释: Indicates how much of the extra space in the LinearLayout will be allocated to the view associated with these LayoutParams. Specify 0 if the view should not be stretched. Otherwise the extra pixels will be pro-rated 

Android中设置半个屏幕大小且居中的按钮布局 (layout_weight属性)

先看如下布局 : 上图中,按钮的大小为屏幕的一半,然后居中显示在布局中央,每个人心中都有自己的答案,看看我的方法吧,布局布局xml如下 : <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/main_layout&

安卓基础之按比例布局layout_weight和weightSum

再看开发文档中对layout_weight属性的描述: "定义weight总和的最大值.如果未指定该值,以所有子视图的layout_weight属性的累加值作为总和的最大值.一个典型的案例是:通过指定子视图的layout_weight属性为0.5,并设置LinearLayout的weightSum属性为1.0,实现子视图占据可用宽度的50." XML文件仅仅包含一个Button,它的宽度占据整个屏幕的一半,代码如下: [html] view plaincopy <LinearLa

安卓布局查看器uiautomatorviewer的使用

今天在看别人写的代码,但是由于布局文件嵌套太多,并且代码中多处对ui进行的改动,导致很难理解布局格式, 于是,找到了这个工具uiautomatorviewer,好,开始搞起. uiautomatorviewer这个工具的作用是,它会提供一个可视化的工具来查看ui的层级,和具体的元素属性,类似chrome的开发者模式. 1.uiautomatorviewer位置在安卓sdk目录下的tools文件夹下. 2.连接设备,打开要查看的app. 3.启动uiautomatorviewer,点击页面左上角的

安卓布局之类

安卓的布局:1.线性布局:按照垂直或者水平的方向布局的组件.2.相对布局:相对于其他的组件的布局的方式.3.绝对布局:按照绝对坐标来布局的组件.4.表格布局:按照行列方式布局的组件.5.帧布局:组件从屏幕左上方布局组件. 线性布局:是安卓开发中间最常用的一种布局方式,他是按照垂直或者水平方向来布局,通过"android:orientation"属性可以设置成线性布局的方向.属性值有垂直和水平两种.常用属性:android:orientation:可以设置布局的方向.android:gr

安卓布局

1. FrameLayout 最简单的布局 是类似一个九宫格的布局, 子元素用 android:layout_gravity 属性来确定位置.这个很简单.可以在开发环境中拖动,看看效果. 2. LinearLayout 线性布局 简单来说就是子元素按照一条线来排序 LinearLayout元素 orientation属性值  vertical(竖着排)  horizontal(横着排) 子元素中可以使用 android:layout_weight 属性来设置比重 相当于在线性布局中,一条线子元素

RelativeLayout相对布局 安卓布局技巧

http://blog.csdn.net/nieweiking/article/details/38417317 RelativeLayout相对布局 相对布局 RelativeLayout 允许子元素指定它们相对于其父元素或兄弟元素的位置,这是实际布局中最常用的布局方式之一.它灵活性大很多,当然属性也多,操作难度也大,属性之间产生冲突的的可能性也大,使用相对布局时要多做些测试. 下面是常用的一些属性 第一类:属性值为true或false android:layout_centerHrizont