2.2 布局管理器

在Android开发中,界面的设计是通过布局文件实现的,布局文件采用XML的格式,每个应用程序默认会创建一个activity_main.xml布局文件,它是应用启动的界面。接下来将详细介绍布局的创建使用以及布局的类型。

2.2.1 创建和使用布局文件

在开始一个新的界面设计时,需要重新创建一个新的布局文件,下面将详细介绍如何创建一个新的布局文件以及如何在Activity中使用。

(1)打开项目,找到layout文件夹,如图2-2所示,右击,选择New→XML→Layout XML File(布局文件)命令,然后就会创建一个新的布局文件。

(2)新创建的布局文件可以通过在xml文件中添加组件,也可以通过在图形用户界面上直接进行拖拉操作,然后再次通过代码进行调整,这种方式减少了用户的代码编写量。具体的操作如图2-3所示。

2.2.2 布局的类型

一个优秀的布局设计对UI界面起到重要的作用,在Android中布局分为7种,分别是相对布局、线性布局、表格布局、网格布局、帧布局、绝对布局和扁平化布局。在学习本节之前先介绍基本的宽高单位。

· px:代表像素,即在屏幕中可以显示的最小元素单元。分辨率越高的手机,屏幕的像素点就越多。因此,如果使用px来设置控件的大小,在分辨率不同的手机上控件显示出来的大小也不一样。

· pt:代表磅数,一般pt都会作为字体的单位来显示。pt和px比较相似,在不同分辨率的手机上,用pt作为字体单位显示的大小也不一样。

图2-2 创建布局文件

图2-3 拖拉控件

· dp:代表密度无关像素,又称dip,使用dp的好处是无论屏幕的分辨率如何,总能显示相同的大小,一般使用dp作为控件与布局的宽高单位。

· sp:代表可伸缩像素,采用与dp相同的设计理念,在设置字体大小时使用。

下面将通过示例详细介绍7种布局的用法。

1.相对布局(RelativeLayout)

在创建Android项目时,默认生成的布局文件的布局类型为相对布局。相对布局分为相对于容器和控件两种。为了更好地确定布局中控件的位置,相对布局提供了很多属性,具体如表2-2所示。

表2-2 控件属性描述

表2-2介绍了相对布局中控件的属性描述,下面将通过一个相对布局界面来具体介绍如何使用相对布局。

图2-4是用相对布局的属性来控制控件的大小和位置,具体代码如下所示:

图2-4 相对布局

上述代码中,通过使用RelativeLayout标签来定义一个相对布局,并且添加了两个Button控件。其中Button1通过alignParentTop="true"来指定位于屏幕顶部,通过layout_marginTop="100dp"来设置距离顶部的距离。Button2通过layout_toRightOf="@+id/button"来设置位于Button1右边,通过layout_below来设置位于Button1下边,然后又通过margin-top设置距离Button1的垂直距离。

2.线性布局(LinearLayout)

线性布局是Android中新建布局默认的布局方式,也是Android中较为常用的布局方式,它使用<LinearLayout>标签,主要分为水平线性布局和垂直线性布局,如图2-5所示。

图2-5 线性布局

上述线性布局界面对应的部分代码如下所示:

上述代码使用线性布局放置了3个按钮,布局是水平还是垂直取决于android:orientation,该属性的取值有vertical(垂直)和horizontal(水平)两种。

3.表格布局(TableLayout)

表格布局的方式不同于前面两种,是让控件以表格的形式来排列控件,只要将控件放在单元格中,控件就可以整齐地排列。

表格布局使用<TableLayout>标签,行数由TableRow对象控制,每行可以放多个控件,列数由最宽的单元格决定,假设第一行有2个控件,第二行有3个控件,那么这个表格布局就有3列。在控件中使用layout_column属性指定具体的列数,该属性的值从0开始,代表第一列。下面将通过一个具体的实例来讲解TableLayout的使用,如图2-6所示。

图2-6 表格布局

上述代码中使用表格布局的方式,设计了两行,每行一个按钮的布局,使用android:stretchColumns="1"属性表示拉伸第二列,android:layout_column="0"属性表示显示在第一列中。

需要注意的是,TableRow不需要设置宽度和高度,其宽度一定是自动填充容器,高度根据内容改变。但对于TableRow的其他控件来说,是可以设置宽度和高度的,但必须是wrap_content或者fill_parent。

4.网格布局(GridLayout)

网格布局由GridLayout代表,它是Android 4.0新增的布局管理器,因此需要在4.0之后的版本才能使用。它的作用类似于table,它把整个容器划分为rows×columns个网格,每个网格可以放置一个组件。GridLayout提供了setRowCount(int)和setColumnCount(int)方法来控制该网格的行数量和列数量。下面通过具体的实例讲解网格布局的使用,如图2-7所示。

图2-7 网格布局

图2-7的界面具体实现代码如下:

上述代码采用网格布局GridLayout设计了一个简单的计算器界面,分别使用columncount和rowcount属性设置整体界面布局为4行4列,其中“=”按钮Button通过设置属性columnSpan="2"表示占据了两列,“+”按钮Button通过设置属性rowSpan="2"表示占据了两行。使用layout_column表示该按钮在第几列。

5.帧布局(FrameLayout)

帧布局是Android布局中最简单的一种,帧布局为每个加入其中的控件创建了一块空白区域。采用帧布局的方式设计界面时,只能在屏幕左上角显示一个控件,如果添加多个控件,这些会依次重叠在屏幕左上角显示,且会透明显示之前的文本,如图2-8所示。

从图2-8可以看到,界面中放置了3个Button控件,最先添加的Button1最大,在最下边;然后添加的Button2较小一点,在Button1上面;最后添加的最小的Button3在最上面,这3个控件重叠显示在屏幕的左上角。

上面帧布局的界面实现代码如下:

图2-8 帧布局

6.绝对布局(AbsoluteLayout)

绝对布局是通过指定x、y坐标来控制每一个控件的位置,放入该布局的控件需要通过android:layout_x和android:layout_y两个属性指定其在屏幕上的确切位置。把屏幕看作一个坐标轴,左上角为(0,0),往屏幕下方为y正半轴,右方为x正半轴。下面将通过一个具体的例子来讲解绝对布局的使用过程,如图2-9所示。

从图2-9可以看出,布局里放置了一个Button,然后通过指定其x和y坐标来放置其位置。具体实现代码如下:

图2-9 绝对布局

理论上绝对布局可以设计任何布局,但是实际的工程中不提倡使用这种布局,因为在使用这种布局时需要精确地计算各个控件的大小,而且运行在不同大小的屏幕上产生的效果也不相同,所以一般不提倡使用这种布局方式。

7.扁平化布局(ConstraintLayout)

ConstraintLayout是Android Studio 2.2中主要的新增功能之一,也是Google在2016年的I/O大会上重点宣传的一个功能。在传统的Android开发中,界面基本都是靠编写XML代码完成的,虽然Android Studio也支持可视化的方式来编写界面,但是操作起来并不方便,ConstraintLayout就是为了解决这一问题而出现的。它和传统编写界面的方式恰恰相反,ConstraintLayout非常适合使用可视化的方式来编写界面,但并不太适合使用XML的方式来进行编写。当然,可视化操作的背后仍然还是使用XML代码来实现,只不过这些代码是由Android Studio根据我们的操作自动生成的。

Android studio默认生成的ConstraintLayout布局代码如下所示: