本节主要介绍的是:以ViewGroup为基类派生的布局管理器
下面显示了android布局管理器的类图:
android应用的图形用户界面具有良好的平台无关性,就是使用布局管理器来管理组件的分布、大小,而不是直接设置组件的位置和大小。
1、LinearLayout类(线性布局):
可以将容器里的组件一个挨一个地排列起来,LinearLayout可以控制各组件的排列方式(横向或者纵向)。
下面显示了LinearLayout支持的XML属性以及相关的方法:
LinearLayout包含的子元素都受LinearLayout.LayoutParams控制,
LinearLayout.LayoutParams子元素支持的常用XML属性及相关方法:
2、TableLayout类(表格布局):
TableLayout继承了LinearLayout,它的本质还是线性布局管理器,TableLayout采用行、列的形式来管理UI组件,TableLayout并不需要明确包含多少行、多少列,而使通过添加TableRow等其他组件来控制表格的行数和列数。
在表格布局中,列的宽度由该列中最宽的那个单元格决定,整个表格的布局宽度则取决于父容器的宽度(默认情况下是占满父容器本身)
在TableLayout中,可以设置单元格如下行为方式:
Shrinkable:某列被设置为Shrinkable,该列的所有单元格的宽度可以被收缩,以保证表格能够适应父容器的宽度。
Stretchable:某列被设置为Stretchable,该列的所有单元格宽度可以被拉伸,保证组件能完全填满表格空余空间。
Collapsed:某列被设置为Collapsed,该列的所有单元格会被隐藏。
TableLayout继承了LinearLayout,它完成可以支持LinearLayout所支持的全部XML属性,除此之外,TableLayout支持如下属性:
对于列序号,我们通常从0开始,0代表第一列,1代表第2列,依次下去。。。
3、FrameLayout类(帧布局):
从开始的布局管理器类图可以知道,FrameLayout直接继承于ViewGroup。
FrameLayout为每个加入其中的组件创建一个空白的区域,每个子组件占据一帧,这些帧会根据gravity属性执行自动对齐。
FrameLayout常用的XML属性及向光方法:
FrameLayout包含的子元素也受FrameLayout.LayoutParams控制,博客中给出了FrameLayout的对应“霓虹灯效果”的例子。
4、RelativeLayout类(相对布局):
相对布局容器内子组件的位置总是相对兄弟组件、父容器来决定的,这种布局方式称为相对布局。
例:A组件的位置是由B组件的位置来决定的,则要求先定义B组件的位置,再定义A组件。
RelativeLayout支持的XML属性如下:
为了控制RelativeLayout布局中子组件的布局分布,RelativeLayout提供了一个内部类:RelativeLayout.LayoutParams,该类提供大量XML属性控制布局分布:
下面是RelativeLayout.LayoutParams设置为true、false的XML属性
下面是RelativeLayout.LayoutParams设置为其他UI组件ID的属性:
除此之外,RelativeLayout.LayoutParams还继承了android.view.ViewGroup.MarginLayoutParams,则RelativeLayout布局容器中每个子组件可以指定为android.view.ViewGroup.MarginLayoutParams所支持的XML属性。
5、GridLayout类(网格布局):
这是android4.0新增的布局管理器,需要在android4.0之后的版本中才可以使用。
GridLayout作用类似于HTML中的table标签,把整个容器划分成rows*columns个网格,每个网格可以放置一个组件,也可以设置一个组件横跨多少列、一个组件纵跨多少行。
下面列出了GridLayout常用的XML属性以及相关的方法:
为了控制GridLayout布局容器中各子组件的布局分布,GridLayout提供了一个内部类:GridLayout.LayoutParams,该类提供了一些XML属性来控制GridLayout布局容器中子组件的布局分布:
6、AbsoluteLayout类(绝对布局):
绝对布局就是空布局,即android不提供任何布局控制,而是由开发人员自己通过X坐标、Y坐标来控制组件的位置。当使用AbsoluteLayout作为布局容器时,布局容器不再管理子组件的位置、大小,这些都要开发人员自己控制。
使用绝对布局的XML属性:
layout_x:指定该组件的X坐标
layout_y:指定该组件的Y坐标
AbsoluteLayout不是一个好思路,因为运行android程序的手机千差万别,各种参数和性能都不同,AbsoluteLayout很难兼顾不同屏幕大小和分辨率的问题,所以AbsoluteLayout已经过时。
下面介绍一下android中常用的距离单位: