TableLayout布局是网格布局。
它拥有<TableRow>标记代表一行,它在布局里面相当于一个小容器。网格布局没有代表列的标记,列的实现是通过在行标记里面添加组件,每个组件占一列。注意:每个行的高度是由此行中高度值最大的组件决定,每一列的长度由这一列中宽度值最大的组件决定,还要注意在一行中高度小于行高度的组件,组件实际的高度不变,只是组件位于小网格的中间,而列的宽度决定了组件实际显示的大小,即使组件没有这么宽,也会被放大。<TableRow>标记有一个android:padding属性,用于设置此行的内边距。
布局属性android:collapseColumns:取值为0,1..它代表隐藏相应序号的列,后面的列向前补齐,如果为多个值,值间用逗号隔开。
布局属性android:stretchColumns:取值0,1..它代表允许被拉伸的列,被拉伸的列平均分配剩余行中未沾满的空间,注意设置能够拉伸的组件的android:gravity属性让组件内容居中,这样拉伸后才美观。这个属性+空白列(实际存在,占用列序号,只是看不到空间大小)可以用于将主要组件在某些位置居中显示适应不同屏幕分辨率需求,让空白列增加或减少以使空白列均分行中未使用空间,这样就使得主要的控件位于中间。
布局属性android:shrinkColumns:取值0,1..他代表允许被收缩的列。每行中空间足够时按原大小显示,当一行中空间不足时,超过屏幕的部分是不会被显示的,只有设置了某一列或多列为可收缩(其实是增加高度来实现内容的显示)时,屏幕能够显示全部内容。如果设置了一些列为可收缩且此时空间已满,再增加组件,则可收缩组件各自收缩一部分(都会收缩,至于占比,这不是这篇文章的重点,需要注意的是可能组件收缩后显示不了全部内容)。
注意:如果不使用<TableRow>标记直接增加组件,那么组件将独占一行。测试了一下在组件中设置宽度为match_parent属性和wrap_content初始显示时没有任何区别,但如果是EditText组件被设置为match_parent值那么它的大小一旦改变则不会还原占据屏幕剩余空间,设置为wrap_content则一直为包裹内容大小(包括隐藏文本),通过这个例子说明虽然起始显示无差别,但是系统内部设置是有区别的。