Android GridLayout

分享到:

GridLayout是Android4.0增加的网格布局控件,与之前的TableLayout有些相似,可以把其它控件以行和列的形式整齐摆放到屏幕上。性能及功能都要比tablelayout好,比如GridLayout布局中的单元格可以跨越多行,而tablelayout则不行,此外,其渲染速度也比tablelayout要快。可以简单把GridLayout理解成TableLayout的升级版本,文档最后有一个GridLayout布局实例可供参考。

GridLayout类结构:

java.lang.Object

	android.view.View

		android.view.ViewGroup

			android.widget.GridLayout

GridLayout注意事项:

该布局把子视图存放在一个矩形网格中。
网格是由被无数虚细线分割成多个单元格的可视区域组成。贯穿整个API的网格线通过网格索引数来指定。一个N列的网格在运行中包含0到N的 N+1个索引,不管怎么配置GridLayout 网格索引0是固定网格容器的前边距,索引N是固定容器的后边距(考虑后填充)。

行和列的规格
在rowSpec和columnSpec布局参数的定义后,子视图占用一个或者多个连续单元格,每个规范是定义被占用的行或列的设置和子视图在单元格是如何对齐。尽管各个单元格在一个GridLayout中不重叠,GridLayout并没有阻止子视图被定义为占据相同的单元格或者单元格组。然而在这种情况下,也不能保证子视图在布局操作完成后自己不会重叠。

默认单元格分配
如果一个子视图没有指定占据的行和列索引,GridLayout会自动指定单元格位置,包括:方向,行数和列数的属性。

空间(Place)
子视图之间的空间可能会通过使用专用的空间视图的实例,或通过设置leftMargin,topMargin,rightMargin和bottomMargin布局参数后指定。当设置为useDefaultMargins属性,根据当前平台的用户界面风格,子视图周围的默认边距将自动分配。每个被定义的边距可通过分配到相应的布局参数来独立覆盖。默认值通常在不同组成部分会产生一个合理的间距,但在不同平台版本之间可能会改变。

多余的空间分布
GridLayout的多余的空间分布是基于优先级,而不是根据比例。
一个子视图的的伸展程度通过其行和列的组的对其属性推算(这是典型的设置子视图的布局参数gravity属性)。如果对齐是沿着给定的轴定义,那么该组件在这个方向具有灵活性。如果没有对齐,相反组件会缺乏灵活性。
多个组件在同一行或列组被认为平行的。如果组中所有在内的组件是灵活的,那么这个小组是灵活的。位置在一个共同的边界两侧的行和列组,反而认为采取同一系列。如果复合组的一个元素是灵活的,则这个复合组是灵活的。
为了使一列伸展,确保所有的组件,它里面定义一个的gravity属性。为了防止从列伸展,确保列中的组成部分之一没有定义的gravity属性。
灵活性的原则并不能完全的消除歧义,推荐GridLayout中的算法更接近其右侧和底边的行和列。

局限性
GridLayout的不提供支持空间(weight)分配的原则,空间分配界定。在一般情况下,可以配置一个GridLayout多余的空间分布在多个行或列之间的不相同的比例。
一些常见的适用情况,如下:将等量的周围空间中的一个组成部分单元格组;使用居中对齐(或gravity属性)。对于完全控制对或列中多余的空间分布;使用的LinearLayout子视图约束相关的单元格组的组成部分。当使用这些技术,记住,单元格组可能定义重叠。
为GridLayout的使用布局参数的完整描述GridLayout.LayoutParams。

XML布局属性:

android:alignmentMode 当设置alignMargins,使视图的外边界之间进行校准,定义其边距,当设置alignBounds,使视图的边界之间进行校准,默认设置alignMargins。
android:columnCount 自动定位子视图时创建的最大列数
android:columnOrderPreserved 当设置为true,使列边界显示的顺序和列索引的顺序相同。默认是true。
android:orientation Orientation属性在布局时候不被使用,它仅当子视图布局参数没有指定的时候分配行和列,GridLayout在这种情况下和LinearLayout使用方法一样,根据标志的值将所有组件放在单个行或者放在当个列中。在水平情况下,当一行的所有列都填充满时,columnCount属性额外提供创建新行。同样在垂直情况下,rowCount属性有相同的作用,默认是水平的。
android:rowCount 自动定位子视图时创建的最大行数
android:rowOrderPreserved 当设置为true,使行边界显示的顺序和行索引的顺序相同。默认是true。
android:useDefaultMargins 当设置ture,当没有指定视图的布局参数时,告诉GridLayout使用默认的边距。默认值是false。

GridLayout公共方法:

GridLayout.LayoutParams generateLayoutParams (AttributeSet attrs) 在提供的属性集基础上返回一个新的布局参数设置。
参数 attrs 创建布局参数的属性
返回值 ViewGroup.LayoutParams实例或者他的派生实例
getAlignmentMode () 返回对齐方式.
相关XML属性 android:alignmentMode
返回值 对齐方式; ALIGN_BOUNDS 或者 ALIGN_MARGINS
getColumnCount () 返回当前的列数。通过 setColumnCount(int)方法最后一次设置的值,如果没有这样的值被设置,返回在columnSpec定义中的每一个上限的最大值。
相关XML属性 android:columnCount
返回值 当前的列数
getOrientation () 返回当前方向。
相关XML属性 android:orientation
返回值 HORIZONTAL 或者 VERTICAL
getRowCount () 返回当前的行数。通过 setRowCount(int)方法最后一次设置的值,如果没有这样的值被设置,返回在rowSpec定义中的每一个上限的最大值。
相关XML属性 android:rowCount
返回值 返回当前的行数。
getUseDefaultMargins () 返回是否GridLayout分配时候,没有相应布局参数定义的默认边距。
相关XML属性 android:useDefaultMargins
返回值 如果分配默认的边距返回ture
isColumnOrderPreserved () 返回是否通过表格索引顺序定制列边界。
相关XML属性 android:columnOrderPreserved
返回值 如果列边界按照索引的顺序显示返回ture,否则返回false
isRowOrderPreserved () 返回是否通过表格索引顺序定制行边界
相关XML属性 android:rowOrderPreserved
返回值 如果行边界按照索引顺序显示返回ture,否则返回false
requestLayout () 当无效的视图布局发生变化时候调用它,将通过视图树进行布局传递。
setAlignmentMode (int alignmentMode) 设置该容器中所有子视图之间的对齐方式。默认的值是ALIGN_MARGINS
相关XML属性 android:alignmentMode
参数 alignmentMode ALIGN_BOUNDS 或者 ALIGN_MARGINS
setColumnCount (int columnCount) 列数是仅用于当没有一个布局参数指定时候,生成默认的列/行索引。
相关XML属性 android:columnCount
参数 columnCount 列的数量
setColumnOrderPreserved (boolean columnOrderPreserved) 当此属性为true,GridLayout的是被迫使他们相关的网格指数在视图中以升序顺序放置列的边界。
当此属性是false,GridLayout是放置在任何最适合给定的约束水平列边界的顺序。此属性的默认值是true。
相关XML属性 android:columnOrderPreserved
参数 columnOrderPreserved 用ture是被迫使他们相关的网格指数在视图中以升序顺序放置列的边界。
setOrientation (int orientation) Orientation是仅用于当没有一个布局参数指定时候,生成默认的列/行索引
默认的属性值是HORIZONTAL
相关XML属性 android:orientation
参数 orientation HORIZONTAL 或者 VERTICAL
setRowCount (int rowCount) RowCount是仅用于当没有一个布局参数指定时候,生成默认的列/行索引
相关XML属性 android:rowCount
参数 rowCount 行数
setRowOrderPreserved (boolean rowOrderPreserved) 当此属性为true,GridLayout是强制他们相关的网格指数在视图中以升序顺序放置行的边界。
当此属性是false,GridLayout是放置在任何最适合给定的约束水平行边界的顺序。此属性的默认值是true。
相关XML属性android:rowOrderPreserved
参数rowOrderPreserved 用ture是强制他们相关的网格指数在视图中以升序顺序放置列的边界。
setUseDefaultMargins (boolean useDefaultMargins) 当设置为true, GridLayout根据子视图的的视觉特征分配在子视图周围的默认边距,每个定义的边距,可独立分配到相应的布局参数覆盖。
如果为false,所有边距的默认值是零。
当设置为true时,考虑设置的alignmentMode属性值ALIGN_BOUNDS。此属性的默认值是false。
相关XML属性 android:useDefaultMargins
参数 useDefaultMargins 使用true分配默认的边距

GridLayout实例,模拟一个计算器面板(注:以下布局需要Android4.0或更高版本的SDK支持):

XML布局代码如下:(本例源码来自网络)

<?xml version="1.0" encoding="utf-8"?>
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:rowCount="5"
android:columnCount="4" >
  <Button
android:id="@+id/one"
android:text="1"/>
  <Button
android:id="@+id/two"
android:text="2"/>
   <Button
android:id="@+id/three"
android:text="3"/>
  <Button
android:id="@+id/devide"
android:text="/"/>
  <Button
android:id="@+id/four"
android:text="4"/>
  <Button
android:id="@+id/five"
android:text="5"/>
  <Button
android:id="@+id/six"
android:text="6"/>
  <Button
android:id="@+id/multiply"
android:text="×"/>
  <Button
android:id="@+id/seven"
android:text="7"/>
  <Button
android:id="@+id/eight"
android:text="8"/>
  <Button
android:id="@+id/nine"
android:text="9"/>
<Button
android:id="@+id/minus"
android:text="-"/>
<Button
android:id="@+id/zero"
android:layout_columnSpan="2"
android:layout_gravity="fill"
android:text="0"/>
  <Button
android:id="@+id/point"
android:text="."/>
<Button
android:id="@+id/plus"
android:layout_rowSpan="2"
android:layout_gravity="fill"
android:text="+"/>
<Button
android:id="@+id/equal"
android:layout_columnSpan="3"
android:layout_gravity="fill"
android:text="="/>
</GridLayout>

运行效果如下图:

总结一下:

首先它与LinearLayout布局一样,也分为水平和垂直两种方式,默认是水平布局,一个控件挨着一个控件从左到右依次排列,但是通过指定android:columnCount设置列数的属性后,控件会自动换行进行排列。另一方面,对于GridLayout布局中的子控件,默认按照wrap_content的方式设置其显示,这只需要在GridLayout布局中显式声明即可。

其次,若要指定某控件显示在固定的行或列,只需设置该子控件的android:layout_row和android:layout_column属性即可,但是需要注意:android:layout_row="0"表示从第一行开始,android:layout_column="0"表示从第一列开始,这与编程语言中一维数组的赋值情况类似。

最后,如果需要设置某控件跨越多行或多列,只需将该子控件的android:layout_rowSpan或者layout_columnSpan属性设置为数值,再设置其layout_gravity属性为fill即可,前一个设置表明该控件跨越的行数或列数,后一个设置表明该控件填满所跨越的整行或整列。

昵    称:
验证码:

相关文档:

Android控件
Android基础知识
Android组件
Android实例