android github gridlayout
2016-03-14 17:17:00 u012806692 阅读数 341

仅作为记录。。。

在使用GridLayout使用时需要注意首先要指定行数和列数,需要注意的是加入你指定了GridLayout的宽度和高度,然后你指定这个GridLayout为4行4列,这个GridLayout不会被平分为等大的16块,API level 21  时使用指定weight可以解决

android:layout_columnWeight="1"
android:layout_rowWeight="1"

API level 21之前的话,我一开始以为可以用指定weight的方式解决,但是GridLayout的子view没有weight属性,所以如果要适配多种分辨率的话解决的方法就是在代码中获得GridLayout的大小,然后计算,在给子view分配大小,很坑啊。。。所以这个GridLayout在api21之前基本就不怎么好用,除非是在指定既定分辨率的情况下才好用。。

还有一个方法是自定义GridLayout,重写其中的onlayout方法,我自己也尝试写了一下但是还没实现跨行跨列。

如果急用的话就推荐不使用GridLayout,用其他的布局代替。


2013-07-25 09:51:00 weixin_30536513 阅读数 2

转载自http://www.cnblogs.com/over140/archive/2011/12/08/2280224.html

欢迎大家转载

前言

  本章内容android.widget.GridLayout章节,版本为Android 4.0 r1(新增),翻译来自:"獨鍆躌踄",欢迎访问他的博客:"http://www.cnblogs.com/mxgsa/",再次感谢"獨鍆躌踄" !期待你一起参与翻译Android的相关资料 

声明

  欢迎转载,但请保留文章原始出处:) 

    博客园:http://www.cnblogs.com/

    Android中文翻译组:http://androidbox.sinaapp.com/

GridLayout

译者署名:獨鍆躌踄

译者链接:http://www.cnblogs.com/mxgsa/

版本:Android 4.0 r1

 

结构

继承关系

public class GridLayout extends ViewGroup

        

java.lang.Object

android.view.View

         android.view.ViewGroup

                   android.widget.GridLayout

 

类概述

 (转自文章精选1)

该布局把子视图存放在一个矩形网格中。

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

 

行和列的规格

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

 

默认单元格分配

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

 

空间(Place)

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

 

多余的空间分布

GridLayout的多余的空间分布是基于优先级,而不是根据比例。

一个子视图的的伸展程度通过其行和列的组的对其属性推算(这是典型的设置子视图的布局参数gravity属性)。如果对齐是沿着给定的轴定义,那么该组件在这个方向具有灵活性。如果没有对齐,相反组件会缺乏灵活性。

多个组件在同一行或列组被认为平行的。如果组中所有在内的组件是灵活的,那么这个小组是灵活的。位置在一个共同的边界两侧的行和列组,反而认为采取同一系列。如果复合组的一个元素是灵活的,则这个复合组是灵活的。

为了使一列伸展,确保所有的组件,它里面定义一个的gravity属性。为了防止从列伸展,确保列中的组成部分之一没有定义的gravity属性。

灵活性的原则并不能完全的消除歧义,推荐GridLayout中的算法更接近其右侧和底边的行和列。

 

局限性

GridLayout的不提供支持空间(weight)分配的原则,空间分配界定。在一般情况下,可以配置一个GridLayout多余的空间分布在多个行或列之间的不相同的比例。

一些常见的适用情况,如下:将等量的周围空间中的一个组成部分单元格组;使用居中对齐(或gravity属性)。对于完全控制对或列中多余的空间分布;使用的LinearLayout子视图约束相关的单元格组的组成部分。当使用这些技术,记住,单元格组可能定义重叠。

 

XML属性

 

属性名称

描述

android:alignmentMode

当设置alignMargins,使视图的外边界之间进行校准,定义其边距,当设置alignBounds,使视图的边界之间进行校准,默认设置alignMargins

常量

备注

alignBounds

0

对齐子视图边界。

alignMargins

1

对齐子视图边距。

android:columnCount

自动定位子视图时创建的最大列数

android:columnOrderPreserved

当设置为true,使列边界显示的顺序和列索引的顺序相同。默认是true

android:orientation

Orientation属性在布局时候不被使用,它仅当子视图布局参数没有指定的时候分配行和列,GridLayout在这种情况下和LinearLayout使用方法一样,根据标志的值将所有组件放在单个行或者放在当个列中。在水平情况下,当一行的所有列都填充满时,columnCount属性额外提供创建新行。同样在垂直情况下,rowCount属性有相同的作用,默认是水平的。

常量

备注

horizontal

0

定义水平部件。

vertical

1

定义垂直部件。

android:rowCount

自动定位子视图时创建的最大行数

android:rowOrderPreserved

当设置为true,使行边界显示的顺序和行索引的顺序相同。默认是true

android:useDefaultMargins

当设置ture,当没有指定视图的布局参数时,告诉GridLayout使用默认的边距。默认值是false

 

GridLayout的使用布局参数的完整描述GridLayout.LayoutParams

 

常量

 

类型

属性名称

描述

int

ALIGN_BOUNDS

这是alignmentMode的常量,当alignmentMode设置成ALIGN_BOUNDS,每个组件之间的原始视图边界边距对齐:即组件的区域通过下面分隔:顶部,左侧,底部和右侧的属性。默认值:0

int

ALIGN_MARGINS

这是alignmentMode的常量。当alignmentMode设置ALIGN_MARGINS,每个视图的边界向外延伸,根据他们的边距,产生的矩形边距对齐。默认值:1

int

HORIZONTAL

水平方向。默认值:0

int

UNDEFINED

常数用于表示一个不确定的值。该字段可以使用这个值来表示他们的值观尚未确定。同样的方法可以返回这个值,表明没有能实现返回的合适值,该常数的值(目前MIN_VALUE)是为了避免可能不知道其标志的有效值之间的混淆。

int

VERTICAL

垂直方向。默认值:1

 

 

 

字段

 

public static final GridLayout.Alignment

属性名称

描述

BASELINE

表示一个视图应该和在同一单元格组的其他视图基线对齐,这个常量仅用做rowSpecs对齐

BOTTOM

表示一个视图应该和在同一单元格组的其他视图底部边距对齐。

CENTER

表示一个视图应该和在同一单元格组的其他视图居中对齐,此常数可用于rowSpecscolumnSpecs

FILL

表示视图应该扩大以填充其单元格组。此常数可用于rowSpecscolumnSpecs

LEFT

表示一个视图应该和在同一单元格组的其他视图左边距对齐。

RIGHTT

表示一个视图应该和在同一单元格组的其他视图右边距对齐。

TOP

表示一个视图应该和在同一单元格组的其他视图上边距对齐。

 

 

公共方法

public GridLayout.LayoutParams generateLayoutParams (AttributeSet attrs)

在提供的属性集基础上返回一个新的布局参数设置。

参数

attrs                   创建布局参数的属性

返回值

                  ViewGroup.LayoutParams实例或者他的派生实例

 

public int getAlignmentMode ()

返回对齐方式.

相关XML属性

android:alignmentMode

返回值

对齐方式;  ALIGN_BOUNDS 或者 ALIGN_MARGINS

参见

ALIGN_BOUNDS

ALIGN_MARGINS

setAlignmentMode(int)

 

public int getColumnCount ()

返回当前的列数。通过 setColumnCountint)方法最后一次设置的值,如果没有这样的值被设置,返回在columnSpec定义中的每一个上限的最大值。

相关XML属性

android:columnCount

返回值

当前的列数

参见

setColumnCount(int)

columnSpec

 

public int getOrientation ()

返回当前方向。

相关XML属性

android:orientation

         返回值

 HORIZONTAL 或者 VERTICAL

参见

setOrientation(int)

 

public int getRowCount ()

返回当前的行数。通过 setRowCountint)方法最后一次设置的值,如果没有这样的值被设置,返回在rowSpec定义中的每一个上限的最大值。

相关XML

android:rowCount

返回值

返回当前的行数。

参见

setRowCount(int)

rowSpec

 

public boolean getUseDefaultMargins ()

返回是否GridLayout分配时候,没有相应布局参数定义的默认边距

相关XML属性

android:useDefaultMargins

返回值

如果分配默认的边距返回ture

参见

setUseDefaultMargins(boolean)

 

public boolean isColumnOrderPreserved ()

返回是否通过表格索引顺序定制列边界。

相关XML属性

android:columnOrderPreserved

返回值

如果列边界按照索引的顺序显示返回ture,否则返回false

参见

setColumnOrderPreserved(boolean)

 

public boolean isRowOrderPreserved ()

返回是否通过表格索引顺序定制行边界

相关XML属性

android:rowOrderPreserved

返回值

如果行边界按照索引顺序显示返回ture,否则返回false

参见

setRowOrderPreserved(boolean)

 

public void requestLayout ()

当无效的视图布局发生变化时候调用它,将通过视图树进行布局传递。

 

public void setAlignmentMode (int alignmentMode)

设置该容器中所有子视图之间的对齐方式

默认的值是ALIGN_MARGINS.

相关XML属性

android:alignmentMode

参数

alignmentMode       ALIGN_BOUNDS 或者 ALIGN_MARGINS

参见

ALIGN_BOUNDS

ALIGN_MARGINS

getAlignmentMode()

 

public void setColumnCount (int columnCount)

列数是仅用于当没有一个布局参数指定时候,生成默认的列/行索引。

相关XML属性

android:columnCount

参数

columnCount   列的数量.

参见

getColumnCount()

columnSpec

 

public void setColumnOrderPreserved (boolean columnOrderPreserved)

当此属性为trueGridLayout的是被迫使他们相关的网格指数在视图中以升序顺序放置列的边界。

当此属性是falseGridLayout是放置在任何最适合给定的约束水平列边界的顺序。

此属性的默认值是true

相关XML属性

android:columnOrderPreserved

参数

columnOrderPreserved   ture是被迫使他们相关的网格指数在视图中以升序顺序放置列的边界。

参见

isColumnOrderPreserved()

 

public void setOrientation (int orientation)

Orientation是仅用于当没有一个布局参数指定时候,生成默认的列/行索引

默认的属性值是HORIZONTAL

相关XML属性

android:orientation

参数

orientation       HORIZONTAL 或者 VERTICAL

参见

getOrientation()

 

public void setRowCount (int rowCount)

RowCount是仅用于当没有一个布局参数指定时候,生成默认的列/行索引

相关XML属性

android:rowCount

参数

rowCount         行数

参见

getRowCount()

rowSpec

 

public void setRowOrderPreserved (boolean rowOrderPreserved)

当此属性为trueGridLayout是强制他们相关的网格指数在视图中以升序顺序放置行的边界。

当此属性是falseGridLayout是放置在任何最适合给定的约束水平行边界的顺序。

此属性的默认值是true

相关XML属性

android:rowOrderPreserved

参数

rowOrderPreserved ture是强制他们相关的网格指数在视图中以升序顺序放置列的边界。

参见

isRowOrderPreserved ()

 

public void setUseDefaultMargins (boolean useDefaultMargins)

当设置为true GridLayout根据子视图的的视觉特征分配在子视图周围的默认边距,每个定义的边距,可独立分配到相应的布局参数覆盖。

如果为false,所有边距的默认值是零。

当设置为true时,考虑设置的alignmentMode属性值ALIGN_BOUNDS

此属性的默认值是false

相关XML属性

android:useDefaultMargins

参数

useDefaultMargins 使用true分配默认的边距

参见

getUseDefaultMargins()

setAlignmentMode(int)

 

public static GridLayout.Spec spec (int start, GridLayout.Alignment alignment)

返回一个Spec其中:

*   spec.span = [start, start + 1]

*   spec.alignment = alignment

参数

start         the           开始索引

alignment         对齐方式

 

public static GridLayout.Spec spec (int start, int size)

返回一个Spec,其中:

*   spec.span = [start, start + size]

参数

start                   开始位置

size          大小

 

public static GridLayout.Spec spec (int start, int size, GridLayout.Alignment alignment)

返回一个Spec,其中:

*   spec.span = [start, start + size]

*   spec.alignment = alignment

参数

start                            开始位置

size                     大小

alignment         对齐方式

 

public static GridLayout.Spec spec (int start)

返回一个Spec,其中:

*   spec.span = [start, start + 1]

参数

start                            开始索引

 

 

保护方法

protected GridLayout.LayoutParams generateDefaultLayoutParams ()

返回一组默认布局参数。没有设置布局参数执行addviewView)时,这些参数被请求时返回null,并抛出一个异常。

返回值

一组默认布局参数或者null

 

protected GridLayout.LayoutParams generateLayoutParams (ViewGroup.LayoutParams p)

返回一组合法的受支持的布局参数。当一个ViewGroup传递一个布局参数没有通过checkLayoutParams(android.view.ViewGroup.LayoutParams)检测的视图时,此方法被调用。此方法会返回一组新的适合当前ViewGroup的布局参数,可能从指定的一组布局参数中复制适当的属性。

参数

p 被转换成一组适合当前 ViewGroup的布局参数.

返回值

一个ViewGroup.LayoutParams的实例或者其中的一个子节点

 

补充

         文章精选

                   Android 4.0新增SpaceGridLayout初谈

 

GridLayout.Alignment

译者署名:獨鍆躌踄

译者链接http://www.cnblogs.com/mxgsa/

版本:Android 4.0 r1

 

结构

继承关系

public static abstract class GridLayout.Alignment extends Object

        

java.lang.Object

android.widget.GridLayout.Alignment  

 

类概述

对齐指定视图应放置在一个单元格组的某个位置以及尺寸大小。

GridLayout.LayoutParams类包含一个rowSpeccolumnSpec,其中每个都包含对齐。整体单元格组由这两种沿每个轴单独对齐的方式指定。

GridLayout类定义使用最常见的对齐方式,在总体布局上,左,下,右,居中,基线,填充。

转载于:https://www.cnblogs.com/yangzhenlong/p/3213706.html

2017-02-15 00:50:16 java_goodstudy 阅读数 1783

原文摘自: http://blog.csdn.net/jianghuiquan/article/details/8299973


之前有在想,android 如何实现Web这种超出自动换行的布局 其实用gridLayout 便可以实现,比如不确定图片数量,每行确定显示多少个,超出自动换行,

这种场景应很常见,再次便不用图片说明了


GridLayout网格布局

  android4.0以上版本出现的GridLayout布局解决了以上问题。GridLayout布局使用虚细线将布局划分为行、列和单元格,也支持一个控件在行、列上都有交错排列。而GridLayout使用的其实是跟LinearLayout类似的API,只不过是修改了一下相关的标签而已,所以对于开发者来说,掌握GridLayout还是很容易的事情。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即可,前一个设置表明该控件跨越的行数或列数,后一个设置表明该控件填满所跨越的整行或整列。

   我们下面通过XML布局和Java代码布局两种方式分别举例:

  

一、XML方式布局

  1、创建一个空白Activity

  

  3、打开“res/layout/activity_main.xml”文件,修改成以下代码。

  

  (1)第①部分

  <?xml version="1.0" encoding="utf-8">,每个XML文档都由XML序言开始,在前面的代码中的第一行便是XML序言,<?xml version="1.0">。这行代码表示按照1.0版本的XML规则进行解析。encoding = "utf-8"表示此xml文件采用utf-8的编码格式。编码格式也可以是GB2312。

  (2)第②部分

  <GridLayout…… 表示采用网格布局管理器。

  (3)第③部分

  android:layout_width="match_parent" android:layout_height="match_parent"表示布局管理器宽度和高充将填充整个屏幕宽度和高度。

  (4)第④部分

  android:orientation="horizontal"表示采用水平布局,垂直为vertical。

  (5)第⑤部分

  该网格布局管理器采用5行4列。

  4、我们向GridLayout放入16个按钮Button。

    

  5、找不同。

  

  我们对一下,找出不同地方。

  (1)第①部分

  目标0按钮是占据2个格;当前0按钮占1格。  

[html] view plain copy
  1. <Button    
  2.       android:id="@+id/zero"    
  3.       android:layout_columnSpan="2"      //列扩展两列  
  4.       android:layout_gravity="fill"      //按钮填充满两格  
  5.       android:text="0"/>    

  (2)第②部分

  目标·按钮在第4行第3列;当前·按钮在第4行第2列。

  解决办法:0按钮占据2格后,·按钮会自动到这个位置。

  (3)第③部分

  目标+按钮在第4行第4列并且行扩展2行;当前·按钮在第4行第3列。

  解决办法:由于0按钮占据2格后,目标+会自动到这个位置。  

[html] view plain copy
  1. <Button    
  2.       android:id="@+id/plus"    
  3.       android:layout_rowSpan="2"      //行扩展两行   
  4.       android:layout_gravity="fill"     //按钮填充满两格  
  5.       android:text="+"/>    

  (4)第④部分

  目标=按钮在第5行,占据3列位置;当前=按钮在第4行第4列。

  解决办法:位置由于0的扩展后,目前=按钮会自动到第5行;列扩展同0按钮。  

[html] view plain copy
  1. <Button    
  2.       android:id="@+id/equal"    
  3.       android:layout_columnSpan="3"       //列扩展3列  
  4.       android:layout_gravity="fill"       //按钮填充满3格   
  5.       android:text="="/>      

 

  完整源代码: 

[html] view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>    
  2. <GridLayout                                     //网络布局管理器  
  3.     xmlns:android="http://schemas.android.com/apk/res/android"    
  4.     android:layout_width="wrap_content"    
  5.     android:layout_height="wrap_content"    
  6.     android:orientation="horizontal"                  //水平方向  
  7.     android:rowCount="5"                                                  //5行  
  8.     android:columnCount="4" >                                             //4列  
[html] view plain copy
  1. //16个按钮  
  2. <Button                                        
  3.       android:id="@+id/one"    
  4.       android:text="1"/>    
  5. <Button    
  6.       android:id="@+id/two"    
  7.       android:text="2"/>    
  8.  <Button    
  9.       android:id="@+id/three"    
  10.       android:text="3"/>    
  11. <Button    
  12.       android:id="@+id/devide"    
  13.       android:text="/"/>    
  14. <Button    
  15.       android:id="@+id/four"    
  16.       android:text="4"/>    
  17. <Button    
  18.       android:id="@+id/five"    
  19.       android:text="5"/>    
  20. <Button    
  21.       android:id="@+id/six"    
  22.       android:text="6"/>    
  23. <Button    
  24.       android:id="@+id/multiply"    
  25.       android:text="×"/>    
  26. <Button    
  27.       android:id="@+id/seven"    
  28.       android:text="7"/>    
  29. <Button    
  30.       android:id="@+id/eight"    
  31.       android:text="8"/>    
  32. <Button    
  33.       android:id="@+id/nine"    
  34.       android:text="9"/>    
  35.   <Button    
  36.       android:id="@+id/minus"    
  37.       android:text="-"/>    
  38.   <Button    
  39.       android:id="@+id/zero"    
  40.       android:layout_columnSpan="2"    
  41.       android:layout_gravity="fill"    
  42.       android:text="0"/>    
  43. <Button    
  44.       android:id="@+id/point"    
  45.       android:text="."/>    
  46.   <Button    
  47.       android:id="@+id/plus"    
  48.       android:layout_rowSpan="2"    
  49.       android:layout_gravity="fill"    
  50.       android:text="+"/>    
  51.   <Button    
  52.       android:id="@+id/equal"    
  53.       android:layout_columnSpan="3"    
  54.       android:layout_gravity="fill"    
  55.       android:text="="/>      
[html] view plain copy
  1. </GridLayout>    

  6、最终显示效果如下:

      

 

二、Java代码方式布局

  上面我们已经了解采用XML进行LinearLayout布局,我们现在再来学习一下如何使用Java代码完成与之同样功能。

  暂略。

 

题外话:

[html] view plain copy
  1. <strong>AbsoluteLayout绝对布局</strong>  
  2.   
  3. AbsoluteLayout绝对布局犹如div指定了absolute属性,用X,Y坐标来指定元素的位置!  
  4.   
  5. 该布局目前已经淘汰,知道就行了!  
2012-06-27 23:56:00 weixin_33912246 阅读数 1

 

结构

继承关系

public class GridLayout extends ViewGroup

java.lang.Object

android.view.View

android.view.ViewGroup

android.widget.GridLayout


该布局把子视图存放在一个矩形网格中。

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

行和列的规格

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

默认单元格分配

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

空间(Place)

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

多余的空间分布

GridLayout的多余的空间分布是基于优先级,而不是根据比例。

一个子视图的的伸展程度通过其行和列的组的对其属性推算(这是典型的设置子视图的布局参数gravity属性)。如果对齐是沿着给定的轴定义,那么该组件在这个方向具有灵活性。如果没有对齐,相反组件会缺乏灵活性。

多个组件在同一行或列组被认为平行的。如果组中所有在内的组件是灵活的,那么这个小组是灵活的。位置在一个共同的边界两侧的行和列组,反而认为采取同一系列。如果复合组的一个元素是灵活的,则这个复合组是灵活的。

为了使一列伸展,确保所有的组件,它里面定义一个的gravity属性。为了防止从列伸展,确保列中的组成部分之一没有定义的gravity属性。

灵活性的原则并不能完全的消除歧义,推荐GridLayout中的算法更接近其右侧和底边的行和列。

局限性

GridLayout的不提供支持空间(weight)分配的原则,空间分配界定。在一般情况下,可以配置一个GridLayout多余的空间分布在多个行或列之间的不相同的比例。

一些常见的适用情况,如下:将等量的周围空间中的一个组成部分单元格组;使用居中对齐(或gravity属性)。对于完全控制对或列中多余的空间分布;使用的LinearLayout子视图约束相关的单元格组的组成部分。当使用这些技术,记住,单元格组可能定义重叠。

GridLayout的使用布局参数的完整描述GridLayout.LayoutParams

XML属性

属性名称

描述

android:alignmentMode

当设置alignMargins,使视图的外边界之间进行校准,定义其边距,当设置alignBounds,使视图的边界之间进行校准,默认设置alignMargins

常量

备注

alignBounds

0

对齐子视图边界。

alignMargins

1

对齐子视图边距。

android:columnCount

自动定位子视图时创建的最大列数

android:columnOrderPreserved

当设置为true,使列边界显示的顺序和列索引的顺序相同。默认是true

android:orientation

Orientation属性在布局时候不被使用,它仅当子视图布局参数没有指定的时候分配行和列,GridLayout在这种情况下和LinearLayout使用方法一样,根据标志的值将所有组件放在单个行或者放在当个列中。在水平情况下,当一行的所有列都填充满时,columnCount属性额外提供创建新行。同样在垂直情况下,rowCount属性有相同的作用,默认是水平的。

常量

备注

horizontal

0

定义水平部件。

vertical

1

定义垂直部件。

android:rowCount

自动定位子视图时创建的最大行数

android:rowOrderPreserved

当设置为true,使行边界显示的顺序和行索引的顺序相同。默认是true

android:useDefaultMargins

当设置ture,当没有指定视图的布局参数时,告诉GridLayout使用默认的边距。默认值是false

常量

类型

属性名称

描述

int

ALIGN_BOUNDS

这是alignmentMode的常量,当alignmentMode设置成ALIGN_BOUNDS,每个组件之间的原始视图边界边距对齐:即组件的区域通过下面分隔:顶部,左侧,底部和右侧的属性。默认值:0

int

ALIGN_MARGINS

这是alignmentMode的常量。当alignmentMode设置ALIGN_MARGINS,每个视图的边界向外延伸,根据他们的边距,产生的矩形边距对齐。默认值:1

int

HORIZONTAL

水平方向。默认值:0

int

UNDEFINED

常数用于表示一个不确定的值。该字段可以使用这个值来表示他们的值观尚未确定。同样的方法可以返回这个值,表明没有能实现返回的合适值,该常数的值(目前MIN_VALUE)是为了避免可能不知道其标志的有效值之间的混淆。

int

VERTICAL

垂直方向。默认值:1

字段

public static final GridLayout.Alignment

属性名称

描述

BASELINE

表示一个视图应该和在同一单元格组的其他视图基线对齐,这个常量仅用做rowSpecs对齐

BOTTOM

表示一个视图应该和在同一单元格组的其他视图底部边距对齐。

CENTER

表示一个视图应该和在同一单元格组的其他视图居中对齐,此常数可用于rowSpecscolumnSpecs

FILL

表示视图应该扩大以填充其单元格组。此常数可用于rowSpecscolumnSpecs

LEFT

表示一个视图应该和在同一单元格组的其他视图左边距对齐。

RIGHTT

表示一个视图应该和在同一单元格组的其他视图右边距对齐。

TOP

表示一个视图应该和在同一单元格组的其他视图上边距对齐。

公共方法

public GridLayout.LayoutParams generateLayoutParams (AttributeSet attrs)

在提供的属性集基础上返回一个新的布局参数设置。

参数

attrs 创建布局参数的属性

返回值

ViewGroup.LayoutParams实例或者他的派生实例

public int getAlignmentMode ()

返回对齐方式.

相关XML属性

android:alignmentMode

返回值

对齐方式; ALIGN_BOUNDS 或者 ALIGN_MARGINS

参见

ALIGN_BOUNDS

ALIGN_MARGINS

setAlignmentMode(int)

public int getColumnCount ()

返回当前的列数。通过 setColumnCountint)方法最后一次设置的值,如果没有这样的值被设置,返回在columnSpec定义中的每一个上限的最大值。

相关XML属性

android:columnCount

返回值

当前的列数

参见

setColumnCount(int)

columnSpec

public int getOrientation ()

返回当前方向。

相关XML属性

android:orientation

返回值

HORIZONTAL 或者 VERTICAL

参见

setOrientation(int)

public int getRowCount ()

返回当前的行数。通过 setRowCountint)方法最后一次设置的值,如果没有这样的值被设置,返回在rowSpec定义中的每一个上限的最大值。

相关XML

android:rowCount

返回值

返回当前的行数。

参见

setRowCount(int)

rowSpec

public boolean getUseDefaultMargins ()

返回是否GridLayout分配时候,没有相应布局参数定义的默认边距

相关XML属性

android:useDefaultMargins

返回值

如果分配默认的边距返回ture

参见

setUseDefaultMargins(boolean)

public boolean isColumnOrderPreserved ()

返回是否通过表格索引顺序定制列边界。

相关XML属性

android:columnOrderPreserved

返回值

如果列边界按照索引的顺序显示返回ture,否则返回false

参见

setColumnOrderPreserved(boolean)

public boolean isRowOrderPreserved ()

返回是否通过表格索引顺序定制行边界

相关XML属性

android:rowOrderPreserved

返回值

如果行边界按照索引顺序显示返回ture,否则返回false

参见

setRowOrderPreserved(boolean)

public void requestLayout ()

当无效的视图布局发生变化时候调用它,将通过视图树进行布局传递。

public void setAlignmentMode (int alignmentMode)

设置该容器中所有子视图之间的对齐方式

默认的值是ALIGN_MARGINS.

相关XML属性

android:alignmentMode

参数

alignmentMode ALIGN_BOUNDS 或者 ALIGN_MARGINS

参见

ALIGN_BOUNDS

ALIGN_MARGINS

getAlignmentMode()

public void setColumnCount (int columnCount)

列数是仅用于当没有一个布局参数指定时候,生成默认的列/行索引。

相关XML属性

android:columnCount

参数

columnCount 列的数量.

参见

getColumnCount()

columnSpec

public void setColumnOrderPreserved (boolean columnOrderPreserved)

当此属性为trueGridLayout的是被迫使他们相关的网格指数在视图中以升序顺序放置列的边界。

当此属性是falseGridLayout是放置在任何最适合给定的约束水平列边界的顺序。

此属性的默认值是true

相关XML属性

android:columnOrderPreserved

参数

columnOrderPreserved ture是被迫使他们相关的网格指数在视图中以升序顺序放置列的边界。

参见

isColumnOrderPreserved()

public void setOrientation (int orientation)

Orientation是仅用于当没有一个布局参数指定时候,生成默认的列/行索引

默认的属性值是HORIZONTAL

相关XML属性

android:orientation

参数

orientation HORIZONTAL 或者 VERTICAL

参见

getOrientation()

public void setRowCount (int rowCount)

RowCount是仅用于当没有一个布局参数指定时候,生成默认的列/行索引

相关XML属性

android:rowCount

参数

rowCount 行数

参见

getRowCount()

rowSpec

public void setRowOrderPreserved (boolean rowOrderPreserved)

当此属性为trueGridLayout是强制他们相关的网格指数在视图中以升序顺序放置行的边界。

当此属性是falseGridLayout是放置在任何最适合给定的约束水平行边界的顺序。

此属性的默认值是true

相关XML属性

android:rowOrderPreserved

参数

rowOrderPreserved ture是强制他们相关的网格指数在视图中以升序顺序放置列的边界。

参见

isRowOrderPreserved ()

public void setUseDefaultMargins (boolean useDefaultMargins)

当设置为true GridLayout根据子视图的的视觉特征分配在子视图周围的默认边距,每个定义的边距,可独立分配到相应的布局参数覆盖。

如果为false,所有边距的默认值是零。

当设置为true时,考虑设置的alignmentMode属性值ALIGN_BOUNDS

此属性的默认值是false

相关XML属性

android:useDefaultMargins

参数

useDefaultMargins 使用true分配默认的边距

参见

getUseDefaultMargins()

setAlignmentMode(int)

public static GridLayout.Spec spec (int start, GridLayout.Alignment alignment)

返回一个Spec其中:

l spec.span = [start, start + 1]

l spec.alignment = alignment

参数

start the 开始索引

alignment 对齐方式

public static GridLayout.Spec spec (int start, int size)

返回一个Spec,其中:

l spec.span = [start, start + size]

参数

start 开始位置

size 大小

public static GridLayout.Spec spec (int start, int size, GridLayout.Alignment alignment)

返回一个Spec,其中:

l spec.span = [start, start + size]

l spec.alignment = alignment

参数

start 开始位置

size 大小

alignment 对齐方式

public static GridLayout.Spec spec (int start)

返回一个Spec,其中:

l spec.span = [start, start + 1]

参数

start 开始索引

保护方法

protected GridLayout.LayoutParams generateDefaultLayoutParams ()

返回一组默认布局参数。没有设置布局参数执行addviewView)时,这些参数被请求时返回null,并抛出一个异常。

返回值

一组默认布局参数或者null

protected GridLayout.LayoutParams generateLayoutParams (ViewGroup.LayoutParams p)

返回一组合法的受支持的布局参数。当一个ViewGroup传递一个布局参数没有通过checkLayoutParams(android.view.ViewGroup.LayoutParams)检测的视图时,此方法被调用。此方法会返回一组新的适合当前ViewGroup的布局参数,可能从指定的一组布局参数中复制适当的属性。

参数

p 被转换成一组适合当前 ViewGroup的布局参数.

返回值

一个ViewGroup.LayoutParams的实例或者其中的一个子节点


补充

文章精选

Android 4.0新增SpaceGridLayout初谈

 ☆ ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆







转载于:https://my.oschina.net/amigos/blog/64112

2016-05-03 10:46:00 weixin_34037515 阅读数 16

原文:Android Grid Layout

译文的GitHub地址:Android GridLayout

译者注:说实话 我确实没用过GridLayout 好好认识一下吧!

android开发者每天都在问自己一个问题:我到底应该用哪个layout

GridLayout发布已经有一段时间了-New Layout Widgets: Space and GridLayout

然而GridLayout在当前开发中的情况如下:

  • 大多数开发者并不知道这个布局
  • 一些开发者知道GridLayout但是因为某些原因没有使用
  • 只有少部分开发者花时间了解和积极使用

这是我为什么要写这篇文章的原因,因为我觉得这个布局被不公平遗忘了

为什么我们需要Grid Layout

GridLayout可以让你用一个简单的根view创建一个表格系统布局

我可以用LinearLayout嵌套来实现

是可以做到,但是你会有性能问题当布局层次太深

我可以用RelativeLayout来创建

也行,但是RelativeLayout有一些限制,例如:

  • 没法同时控制2个轴线对齐
  • 当组件需要的空间超出你预期的时候会跑出屏幕或发生重叠因为你不能使用weight等等

换一句话说就是RelativeLayout不够灵活和响应性不足。

例子

让我们实现一个简单的布局包含一个大图片,2个小图标和跟在图标后面的文本

Preview

RelativeLayout

用RelatieveLayout实现起来非常简单,通过关键属性layout_below,layout_toRightOflayout_alignTop

Code

一眼看上去好像很完美,等你用不同字体size进行布局测试就呵呵了

问题 1 没法同时控制基于2个轴对齐

单行文本应该相对于图标垂直居中,不幸的是RelativeLayout没有提供这个可能性

Preview

问题 2 组件重叠

多行文本会引起重叠,因为text用了layout_alignTop对图标进行对齐

Preview

GridLayout

如你看到的下面图片一样,GridLayout提供更好的表现结果:

  • 文本垂直居中于图标
  • 多行文本不会向下移动组件
Preview

那么怎么实现这个效果呢?首先定义GridLayout为根布局。然后计算你要多少列并通过android:columnCount属性定义,在我们的例子中我们有2列。

因为GridLayout里面的views是一个接一个被放置的,所以没必要明确定义row和column

如果你想撑开view让它占用2行或2列,你可以用layout_columnSpan/layout_rowSpan属性

还有一件重要的事要记住-如果你想你的view使用所有可用的空间,不要设置width为match_parent,应该设置成0dp同时设置属性layout_gravity="fill"

Code

总结

GridLayout一方面是一个非常强大的工具,它提供了很好的灵活性和性能,另外一方面它需要一些时间来学习了解它如何工作,你通常需要花更多的时间来开发和维护这样的布局。

android GridLayout 介绍

阅读数 1195

没有更多推荐了,返回首页