关于GridLayout的使用

本文详细介绍了如何使用GridLayout布局实现界面元素的高效排列,包括基本配置、控件布局细节调整及关键参数解释,旨在帮助开发者构建美观且功能丰富的用户界面。
关于GridLayout的使用:
1. 首先为容器(Composite,Group…)设置GridLayout:
//GridLayout两个最重要的属性都可以在构造函数里设置,2代表列数;true代表是否各 //列均宽
GridLayout gl = new GridLayout(2,true);
composite.setLayout(gl);
2. 接下来就可以按行逐列添加控件进去
Label label1 = new Label(composite,SWT.NONE);
Text text1 = new Text(composite,SWT.BORDER);
Label label2 = new Label(composite,SWT.NONE);
Text text2 = new Text(composite,SWT.BORDER);
这样就完成了整体的基本布局。
3. 最后,要美化和具体控制每个控件,就需要为每个控件设置GridData了
a) GridData是专门用来和GridLayout配合指定每个控件的具体行为
b) GridData看起来比较复杂,设置参数的方式很多。但是如果看一下GridData的源码就会发现,实质上,我们需要关注并设定的只有horizontalSpan,verticalSpan,grabExcessHorizontalSpace,grabExcessVerticalSpace,verticalAlignment,horizontalAlignment,widthHint,heightHint;这些从字面就可以看出他们的意思,下面分别介绍
i. horizontalSpan和verticalSpan,这两个用来指定当前控件占据的水平和垂直格数,默认值为1。要想设置这两个参数,必须声明一个GridData变量:
GridData gd = new GridData();
gd.horizontalSpan = 2;
label2.setLayoutdata(gd);
这样这个label就占据两列了.
ii. grabExcessHorizontalSpace和grabExcessVerticalSpace,这两个参数用来指定控件所在单元格是否填充的水平剩余空间和竖直剩余空间,默认值为false。这两个参数可以在构造函数中设置:
label2.setLayoutdata(new GridData(GridData.GRAB_HORIZONTAL));
iii. verticalAlignment和horizontalAlignment用来指定控件的对齐方式。有四个值:BEGINNING,CENTER,END和FILL。值得一提的是FILL,用来指定控件是否填满单元格的剩余空间。这两个参数也可以在构造函数里指定
label2.setLayoutdata(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
下面这种设置方式效果也是一样的
GridData gd = new GridData();
gd.horizontalAlignment= true;
label2.setLayoutdata(gd);
iv. widthHint和heightHint用来指定控件所在单元格的最小宽度和最小高度,默认值是SWT.DEFAULT,也就是不指定。这两个必须通过一个有名的GridData来设置:
GridData gd = new GridData();
gd.widthHint= 100;
label2.setLayoutdata(gd);
v. GridData提供了很多常量,通过他们的名字再结合上面的说明,很容易就知道他们究竟是设置什么的:
// Alignment constants.
public static final int BEGINNING = 1;
public static final int CENTER = 2;
public static final int END = 3;
public static final int FILL = 4;

// Style constants
public static final int VERTICAL_ALIGN_BEGINNING = 1 << 1;
public static final int VERTICAL_ALIGN_CENTER = 1 << 2;
public static final int VERTICAL_ALIGN_END = 1 << 3;
public static final int VERTICAL_ALIGN_FILL = 1 << 4;
public static final int HORIZONTAL_ALIGN_BEGINNING = 1 << 5;
public static final int HORIZONTAL_ALIGN_CENTER = 1 << 6;
public static final int HORIZONTAL_ALIGN_END = 1 << 7;
public static final int HORIZONTAL_ALIGN_FILL = 1 << 8;
public static final int GRAB_HORIZONTAL = 1 << 9;
public static final int GRAB_VERTICAL = 1 << 10;

// Style convenience constants
/**
* FILL_VERTICAL = VERTICAL_ALIGN_FILL | GRAB_VERTICAL
*/
public static final int FILL_VERTICAL = VERTICAL_ALIGN_FILL | GRAB_VERTICAL;
/**
* FILL_HORIZONTAL = HORIZONTAL_ALIGN_FILL | GRAB_HORIZONTAL
*/
public static final int FILL_HORIZONTAL = HORIZONTAL_ALIGN_FILL | GRAB_HORIZONTAL;
/**
* FILL_BOTH = FILL_VERTICAL | FILL_HORIZONTAL
*/
public static final int FILL_BOTH = FILL_VERTICAL | FILL_HORIZONTAL;
### 3.1 GridLayout 的基本使用 在 Android 中,`GridLayout` 是从 Android 4.0(API 14)开始引入的一种新型布局方式,它通过虚线将布局划分为行和列,支持控件在行、列上的交错排列,提供更灵活的布局控制[^2]。 在 XML 布局文件中,可以通过如下方式声明 `GridLayout`: ```xml <GridLayout android:layout_width="match_parent" android:layout_height="match_parent" android:columnCount="2" android:rowCount="3"> <Button android:text="Button 1" /> <Button android:text="Button 2" /> <!-- 可以继续添加更多子视图 --> </GridLayout> ``` 上述代码定义了一个 2 列、3 行的网格布局,并在其中放置了两个按钮控件。系统会自动将控件按照从左到右、从上到下的顺序填充到网格中。 ### 3.2 GridLayout 的布局策略 `GridLayout` 的布局策略主要围绕列数、行数以及子视图的排列方式进行设置。开发者可以使用 `android:columnCount` 和 `android:rowCount` 来定义网格的行列数量。如果未显式定义行数,系统会根据列数和子视图数量自动计算行数。 此外,`GridLayout` 支持子视图跨行或跨列显示。例如,以下代码使按钮跨两列显示: ```xml <Button android:text="Span 2 Columns" android:layout_columnSpan="2" /> ``` 还可以通过 `layout_gravity` 属性控制子视图在单元格内的对齐方式,例如: ```xml <Button android:text="Centered" android:layout_gravity="center" /> ``` ### 3.3 支持旧版本 Android 的 GridLayout 对于 Android 4.0 之前的版本,官方提供了兼容包 `android.support.v7.widget.GridLayout`,开发者需要手动导入 `v7` 包中的 `gridlayout` 模块[^3]。该布局的使用方式与原生 `GridLayout` 类似,但需要使用不同的命名空间: ```xml <android.support.v7.widget.GridLayout android:layout_width="match_parent" android:layout_height="wrap_content" app:columnCount="2" app:rowCount="2"> <Button android:text="Button A" app:layout_columnSpan="1" app:layout_rowSpan="1" /> <Button android:text="Button B" app:layout_columnSpan="1" app:layout_rowSpan="1" /> </android.support.v7.widget.GridLayout> ``` 注意,此处使用了 `app` 命名空间来定义 `GridLayout` 的属性,而不是 `android` 命名空间。 ### 3.4 GridLayout 的优势与适用场景 `GridLayout` 提供了比 `TableLayout` 更加灵活的布局方式,其 API 与 `LinearLayout` 类似,学习成本较低。它适用于需要精确控制控件排列位置的场景,例如表单布局、计算器界面、九宫格菜单等。由于其支持跨列、跨行排列,因此在构建复杂的 UI 结构时具有更高的自由度。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值