转载自并做少量添加:http://www.cnblogs.com/playing/archive/2011/04/07/2008620.html
Layout对于迅速的搭建界面和提高界面在不同分辨率的屏幕上的适应性具有很大的作用。这里简要介绍Android的Layout和研究一下它的实现。
Android有Layout:LinearLayout、TableLayout、RelativeLayout、FrameLayout、GridLayout、AbsoluteLayout
放入Layout中进行排布的View的XML属性:
1.几种Layout中Item所共有的XML属性:
注: (1)和(2)用来确定放入Layout中的View的宽度和高度:它们的可能取值为fill_parent,wrap_content或者固定的像素值。
注:(3)(4)(5)(6)是放入Layout中的View期望它能够和Layout的边界或者其他View之间能够相距一段距离。
android:paddingLeft与android:layout_marginLeft的区别:
padding margin都是边距的含义,关键问题得明白是什么相对什么的边距.
padding是控件的内容相对控件的边缘的边距.如果是一个控件的话那么就是,空间内容相对于控件边缘的距离。但是在父控件中设置,那么就是子控件相对于父控件边缘的距离。
layout_margin是控件边缘相对父空间的边距.这个要分布局,如果是线性布局,里面的空间一个接一个排的话,那么会是和下一个控件的距离。如果是相对布局不设置控件之间的关系会只和父控件产生边距。
注:(7)用来确定View在Layout中的停靠位置。
android gravity和layout_gravity区别
android:gravity 属性是对该view里的内容的限定.比如一个button里面的text. 你可以设置该text 在view的靠左,靠右等位置.该属性就干这个。
android:layout_gravity是用来设置该view相对与起父view 的位置.比如一个button 在linearlayout里,你想把该button放在靠左靠右等位置就可以通过该属性设置.
这样就解释了,为什么我们弄个最外布局,然后里面包了几个布局,如果要使这几个布局都靠底,就可以在这几个布局的父布局的属性里设置androi:gravity="bottom" 因为gravity是对里面的内容起作用.
FrameLayout是最简单的Layout,就只具有这些属性。一层层往上糊的布局。
LinearLayout还会有:
注: (8)用于在LinearLayout中把所有子View排布之后的剩余空间按照它们的layout_weight分配给各个拥有这个属性的View。
RelativeLayout有16个align相关的XML属性:
注:(9)到(24)用来确定RelativeLayout中的View相对于Layout或者Layout中的其他View的位置。
GridLayout 网格布局
AbsoluteLayout每个子组件都有两个属性
TableLayout的行TableRow是一个横向的(horizontal)的LinearLayout
注:(35)到(36)是tablelayout为其子控件设置收缩、拉伸以至于完全适应空间。可以设置多个列序号,用逗号分开。
---------------------------------------------------------------------------------------------------------------------------------------------------------------
TableLayout和GridLayout看起来就有很大的相似度,我们在这里给区分一下。
TableLayout本身继承于LinearLayout,所以本质还是线性布局,并不能控制显示多少行,显示完后面的就显示不出了。如果单独一个控件会独占一行。如果想在一行里放多个控件,就把多个控件放在TableRow里,一个TableRow是一行。
GridLayout可以把容器划分为rows*columns个网格,每个网格可以放置一个组件,除此之外还能设置一个组件可以跨越多少行、多少列。
GridLayout是很自由的。如果说要做一个格子类的页面,GridLayout是优于TableLayout的。