Android应用开发案例教程(Android Studio版)
上QQ阅读APP看书,第一时间看更新

1.2 Android布局管理

Android系统应用程序的设计模式采用MVC模式,即把应用程序分为业务模型层(Model)、表现层(View)、控制层(Control)。按照这种模式,界面布局为表现层;Activity控制程序为控制层,将应用程序的界面设计与功能控制设计分离,从而可以单独地修改用户界面。

Android系统的布局管理指的是在XML布局文件中设置组件的大小、间距、排列及对齐方式等。Android系统中常用的布局类型有LinearLayout、FrameLayout、TableLayout、RelativeLayout、GridLayout、ConstraintLayout。

1.2.1 布局文件的规范与重要属性

1.布局文件的规范

Android系统应用程序的XML布局文件有以下规范。

(1)应存放在res/layout目录,其扩展名为.xml。

(2)根节点通常是一个布局方式,在根节点内可以添加组件作为节点。

(3)根节点必须包含一个命名空间:

xmlns:android=http://schemas.android.com/apk/res/android

(4)如果要在Java程序中控制布局的组件,则必须为相应的组件定义一个ID,其定义格式为:

android:id="@id/<组件ID>"

(5)文件名只能由小写英文字母、数字和下划线组成,并且只能以小写字母开头。

2.布局文件的重要属性

(1)设置组件大小的属性

wrap_content:根据组件内容的大小来决定组件的大小。

match_parent:使组件填充所在容器的所有空间。

(2)设置组件大小的单位

px(piexls,像素):即屏幕上的发光点。

dp(或dip)设备独立像素:一种支持多分辨率设备的抽象单位。

sp(scaled pixels,比例像素):设置字体大小。

(3)设置组件的对齐方式

对齐方式由android:gravity属性控制,其属性值有top、bottom、left、right、center_horizontal、center_vertical等。

1.2.2 常见的布局方式

布局文件可以单独创建,创建时需要输入文件名,文件名的字母必须全部小写,然后选择布局类型。如图1-6所示,创建了一个新的线性布局文件,文件名是activity_second.xml。

图1-6 新建XML布局文件

1.线性布局

线性布局(LinearLayout)将组件按照水平或垂直方向排列。在XML布局文件中,由根元素LinearLayout来标识线性布局,由android:orientation属性来设置排列方向,其属性值有水平(horizontal)和垂直(vertical)两种。

(1)设置为水平方向:android:orientation="horizontal"。

(2)设置为垂直方向:android:orientation="vertical"。

【例1-1】线性布局应用示例。

设计一个有5个按钮的线性布局,其控件层级关系如图1-7所示。

图1-7 线性布局的控件层级关系

布局文件activity_main1.xml的源代码如下:

     1. <?xml version="1.0" encoding="utf-8"?>
     2. <Linear Layout xmlns:android="http://schemas.android.com/apk/res/android"
     3.   android:layout_width="fill_parent"
     4.   android:layout_height="fill_parent"
     5.   android:orientation="vertical" >
     6.   <Button
     7.     android:id="@+id/m Button1"
     8.     android:layout_width="wrap_content"
     9.     android:layout_height="wrap_content"
     10.    android:text="1" />
     11.  <Button
     12.    android:id="@+id/m Button2"
     13.    android:layout_width="wrap_content"
     14.    android:layout_height="wrap_content"
     15.    android:text="2" />
     16.  <Button
     17.    android:id="@+id/m Button3"
     18.    android:layout_width="wrap_content"
     19.    android:layout_height="wrap_content"
     20.    android:text="3" />
     21.  <Button
     22.    android:id="@+id/m Button4"
     23.    android:layout_width="wrap_content"
     24.    android:layout_height="wrap_content"
     25.    android:text="4" />
     26.  <Button
     27.    android:id="@+id/m Button4"
     28.    android:layout_width="wrap_content"
     29.    android:layout_height="wrap_content"
     30.    android:text="5" />
     31. </Linear Layout>

程序运行结果如图1-8所示。

图1-8 垂直方向线性布局示例结果

将代码中第5行的“android:orientation="vertical"”(垂直方向的线性布局)更改为“android:orientation ="horizontal"”(水平方向的线性布局),则运行结果如图1-9所示。

图1-9 水平方向线性布局示例结果

这5个按钮改为水平方向排列后,有一个按钮“5”被挤到了界面以外。在布局设计时必须考虑屏幕的宽度,不然就会发生这种意外。

2.帧布局

帧布局(Frame Layout)是将组件放置到左上角位置,当添加多个组件时,后面的组件将遮盖之前的组件。在XML布局文件中,由根元素Frame Layout来标识帧布局。

【例1-2】帧布局应用示例。

将准备的图像文件mm11.jpg复制到drawable目录下,然后新建图1-10所示的布局。

图1-10 布局的控件层级关系和属性

布局文件activity_main2.xml的源代码如下:

     <?xml version="1.0" encoding="utf-8"?>
     <Frame Layout xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:app="http://schemas.android.com/apk/res-auto"
          android:layout_width="fill_parent"
          android:layout_height="match_parent"
          android:foreground="@drawable/logo"
          android:foreground Gravity="right|top">
          <TextView
             android:id="@+id/txt"
             android:layout_width="350dp"
             android:layout_height="200dp"
             android:background="@color/color Accent" />
          <TextView
             android:id="@+id/txt2"
             android:layout_width="250dp"
             android:layout_height="150dp"
             android:background="@color/color Primary"
             android:text="后添加的文本框"
             android:text Size="24sp" />
     </Frame Layout>

修改控制文件Main Activity.java的布局文件调用,这非常重要。

package com.example.chap01;

     import android.os.Bundle;
     import android.support.v7.app.App Compat Activity;
     public class Main Activity extends App Compat Activity
     {
          @Override
          public void onCreate(Bundle saved Instance State)
          {
               super.onCreate(saved Instance State);
               set Content View(R.layout.activity_main2);// 修改布局文件调用
          }
     }

程序运行结果如图1-11所示,后添加的文本框组件遮挡了之前的图像。

图1-11 帧布局示例结果

3.表格布局

表格布局(Table Layout)是将页面划分成由行和列构成的单元格,由根元素Table Layout来标识。表格的行由<Table Row>…</Table Row>定义。组件放置时,由android:layout_column指定列序号。表格布局的3个常用属性如下。

(1)android:collapse Columns:设置需要被隐藏的列序号。

(2)android:shrink Columns:设置允许被收缩的列序号。

(3)android:stretch Columns:设置允许被拉伸的列序号。

【例1-3】表格布局应用示例。

设计一个3行4列的表格布局,如图1-12所示。

图1-12 表格布局

将准备好的图像文件mmx.jpg复制到res\drawable目录下。

布局文件activity_main3.xml的源代码如下:

     <?xml version="1.0" encoding="utf-8"?>
     <Table Layout xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:app="http://schemas.android.com/apk/res-auto"
          android:layout_width="fill_parent"
          android:layout_height="fill_parent">
          <Table Row>
               <Image View
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    app:src Compat="@drawable/mmx" />
               <Image View
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    app:src Compat="@drawable/mmx" />
          </Table Row>
          <Table Row>
               <Image View
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    app:src Compat="@drawable/mmx"
                    android:layout_column="1"/>
               <Image View
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    app:src Compat="@drawable/mmx"
                    android:layout_column="2"/>
          </Table Row>
          <Table Row>
               <Image View
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    app:src Compat="@drawable/mmx"
                    android:layout_column="3"/>
          </Table Row>
     </Table Layout>

4.相对布局

相对布局(Relative Layout)是采用相对于其他组件的位置的布局方式。在相对布局中,通过指定ID关联其他组件,从而以右对齐、上对齐、下对齐或屏幕中央对齐等方式来排列组件。

在XML布局文件中,由根元素Relative Layout来标识相对布局。

【例1-4】应用相对布局设计一个图片和4个按钮,如图1-13所示。

图1-13 相对布局

布局文件activity_main4.xml的源代码如下:

     <?xml version="1.0" encoding="utf-8"?>
     <Relative Layout xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:tools="http://schemas.android.com/tools"
          android:id="@+id/Relative Layout1"
          android:layout_width="match_parent"
          android:layout_height="match_parent" >
          <!-- 这个是在容器中央 -->
          <Image View
               android:id="@+id/img"
               android:layout_width="80dp"
               android:layout_height="80dp"
               android:layout_center In Parent="true"
               android:src="@drawable/abc"
               />
          <!-- 在图片的左边 -->
          <Button
               android:id="@+id/btn1"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:layout_to Left Of="@id/img"
               android:layout_center Vertical="true"
               android:text="左边"
               />
          <!-- 在图片的右边 -->
          <Button
               android:id="@+id/btn2"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:layout_to Right Of="@id/img"
               android:layout_center Vertical="true"
               android:text="右边"
               />
          <!-- 在图片的上面-->
          <Button
               android:id="@+id/btn3"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:layout_above="@id/img"
               android:layout_center Horizontal="true"
               android:text="上面"
               />
          <!-- 在图片的下面 -->
          <Button
               android:id="@+id/btn4"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:layout_below="@id/img"
               android:layout_center Horizontal="true"
               android:text="下面"
          />
     </Relative Layout>

5.网格布局

网格布局(Grid Layout)把设置区域划分为若干行和列的网格,网格中的一个组件可以占据多行或多列。应用网络布局的属性可以设置组件在网络中的大小和摆放方式。

网络布局的主要属性如下。

(1)alignment Mode:设置布局管理器的对齐方式。

(2)column Count:设置网格列的数量。

(3)row Count:设置网格行的数量。

(4)layout_column Span:设置组件占据的列数。

(5)layout_row Span:设置组件占据的行数。

常用的单元格属性如下。

(1)layout_column:指定该单元格在第几列显示。

(2)layout_row:指定该单元格在第几行显示。

(3)layout_column Span:指定该单元格占据的列数。

(4)layout_row Span:指定该单元格占据的行数。

(5)layout_gravity:指定该单元格在容器中的位置。

(6)layout_column Weight:设置列权重。

(7)layout_row Weight:设置行权重。

【例1-5】应用网格布局设计一个计算器界面。

计算器的设计界面如图1-14所示。在界面设计区域中设置一个6行4列的网格布局,第一行为显示数据的文本标签,第二行为清除数据的按钮和加号按钮,第3~6行共安排15个按钮,分别代表数字及运算符号。

图1-14 计算器的设计界面

布局文件activity_main5.xml的源代码如下:

     <?xml version="1.0" encoding="utf-8"?>
          <Grid Layout xmlns:android="http://schemas.android.com/apk/res/android"
               android:layout_width="match_parent"
               android:layout_height="match_parent"
               android:row Count="6"
               android:column Count="4">
          <!--文本标签-->
          <TextView
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_column Span="4"
          android:layout_margin Left="4px"
          android:gravity="left"
          android:text="0"
          android:text Size="50dp"
          />
     <Button
               android:layout_column Weight="1"
               android:layout_column Span="3"
               android:text="清除"
               android:text Size="26sp" />
          <Button android:text="+" android:text Size="26sp" />
          <Button android:text="1" android:text Size="26sp" />
          <Button android:text="2" android:text Size="26sp" />
          <Button android:text="3" android:text Size="26sp" />
          <Button android:text="-" android:text Size="26sp" />
          <Button android:text="4" android:text Size="26sp" />
          <Button android:text="5" android:text Size="26sp" />
          <Button android:text="6" android:text Size="26sp" />
          <Button android:text="*" android:text Size="26sp" />
          <Button android:text="7" android:text Size="26sp" />
          <Button android:text="8" android:text Size="26sp" />
          <Button android:text="9" android:text Size="26sp" />
          <Button android:text="/" android:text Size="26sp" />
          <Button
               android:layout_height="wrap_content"
               android:layout_column Span="2"
               android:layout_column Weight="1"
               android:text="0"
               android:text Size="26sp" />
          <Button android:text="." android:text Size="26sp" />
          <Button android:text="=" android:text Size="26sp" />
     </Grid Layout>

6.约束布局

在Android Studio 2.3版本中新建的Module中,默认的布局就是约束布局(Constraint Layout)。如图1-15所示,工作区中有两种预览,一种是设计预览,一种是蓝图。两者可以辅助进行布局预览。

添加约束十分简单,首先拖动一个Image View到蓝图中,然后单击选中,可以看到上下左右都出现了一个小圆圈,这个圆圈就是用来添加约束的。另外还在4个角出现了小矩形,是用来扩大或缩小控件的。

图1-15 约束布局案例

【例1-6】应用约束布局设计一大一小上下两张图片。

应用约束布局设计两张图片的放置效果如图1-15所示。

布局文件activity_main6.xml的源代码如下:

     <?xml version="1.0" encoding="utf-8"?>
     <android.support.constraint.Constraint Layout
     xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:app="http://schemas.android.com/apk/res-auto"
          xmlns:tools="http://schemas.android.com/tools"
          android:layout_width="match_parent"
          android:layout_height="match_parent">
          <Image View
               android:id="@+id/img"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               app:layout_constraint Left_to Left Of="parent"
               app:layout_constraint Right_to Right Of="parent"
               app:src Compat="@drawable/mm12" />
          <Image View
               android:id="@+id/img2"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               app:src Compat="@mipmap/ic_launcher"
               app:layout_constraint Left_to Left Of="parent"
               app:layout_constraint Right_to Right Of="parent"
               app:layout_constraint Top_to Top Of="parent"
               android:layout_margin Top="380dp" />
     </android.support.constraint.Constraint Layout>

工作区提供了很好的交互,读者只要多动手练习,就能掌握约束布局的属性控制。

介绍完常用布局类型,下面介绍布局里放置的常用组件,如文字、图片、按钮等组件。