第3章Android用户界面程序设计 视频讲解 3.1用户界面基础 用户界面(User Interface)是系统和用户间进行信息交换的媒介。Android实行界面设计者和程序开发者独立并行工作的方式,实现了界面设计和程序逻辑完全分离,不仅有利于后期界面修改中避免修改程序的逻辑代码,也有利于针对不同型号手机的屏幕分辨率调整界面尺寸时不影响程序的运行。 为了使界面设计和程序逻辑分离,Android程序将用户界面和资源从逻辑代码中分离出来,使用XML文件描述用户界面,资源文件独立保存在资源文件夹中。Android用户界面框架(Android UI Framework)采用MVC(ModelViewController)模型,为用户界面提供处理用户输入的控制器(controller)、显示图像的视图(view)和模型(model)。其中,模型是应用程序的核心,保存数据和代码。控制器、视图和模型的关系如图3.1所示。 MVC中的视图呈现用户界面,使用户在界面上进行输入,控制器能够接收并响应用户的动作,如按键和触摸屏幕等,并将这些动作作为一系列独立事件加入队列中,按照“先进先出”的规则将每个事件分配给对应的事件处理函数进行处理,根据处理结果更新模型。视图根据更新后的模型重新绘制界面并向用户展示,形成一个界面、数据更新的循环。 Android系统的界面元素以一种树形结构组织在一起,称为视图树,如图3.2所示。视图树由View和ViewGroup构成。View是一个重要的基类,所有界面上的可见元素都是View的子类,ViewGroup是能够承载多个View的显示单元,用于承载界面布局和具有原子特性的重构模块。 视图树绘制依据从上至下的原则绘制每个界面元素,且每个元素负责完成自身的绘制,如果元素包含子元素,则该元素通知其下所有子元素进行绘制。 图3.1MVC模型 图3.2视图树 Android用户界面是单线程用户界面,事件的获取和界面的屏幕绘制使用同一个线程,这样的好处是用户不需要在控制器和视图间进行同步,事件的处理完全按照队列顺序进行; 但单线程用户界面的缺点是如果事件函数过于复杂,可能导致用户界面失去响应,因此界面的事件响应函数应尽可能使用简短代码,或者将复杂工作交给后台线程处理。 3.2界 面 布 局 Android系统定义了6种基本摆放控件的规则,它们都间接或者直接继承ViewGroup类,下面介绍这几种布局规则。 Android移动网络程序设计案例教程(Android Studio版·第2版·微课视频版) 第 3 章Android用户界面程序设计 视频讲解 3.2.1框架布局 框架布局(FrameLayout)也叫帧布局,该布局上的控件放置在左上角位置,按放置的前后顺序逐一层叠摆放,后面的控件会遮盖之前的控件。 【例31】演示框架布局编程方法。 (1) 创建名为LayoutDemo的新项目,包名为edu.cqut.layoutdemo。切换到Android视图,右击res/layout文件夹,选择New→XML→Layout XML File,在弹出的对话框的Layout File Name栏填入layout_framelayout,在下方的Root Tag栏填入FrameLayout,创建一个框架布局文件。 (2) 在新创建的布局文件中放置一个ImageView和一个TextView控件,代码如下。 (3) 在java/edu.cqut.layoutdemo文件夹的MainActivity.java文件中修改与主Activity绑定的布局文件,修改后的代码如下。 setContentView(R.layout.layout_framelayout); 图3.3框架布局效果图 程序运行结果如图3.3所示,界面布局文件中后添加的文本框控件遮挡了之前的图像控件。 视频讲解 3.2.2线性布局 线性布局(LinearLayout)是将控件按照水平(horizontal)或垂直(vertical)两种方式排列,在布局文件中由android:orientation属性来控制排列方向。水平方向设置为android: orientation=“horizontal”,垂直方向设置为android: orientation=“vertical”。 【例32】演示线性布局编程方法。 (1) 打开LayoutDemo项目,右击res/layout文件夹,选择New→XML→Layout XML File,在弹出的对话框的Layout File Name栏填入layout_linearlayout,在下方的Root Tag栏填入LinearLayout,创建一个线性布局文件。 (2) 将新创建的布局文件的android:orientation属性设置为vertical,然后放置三个TextView控件,分别显示第一行、第二行和第三行,代码如下。 (3) 在MainActivity.java代码中修改与主Activity绑定的布局文件,修改后的代码如下。 setContentView(R.layout.layout_linearlayout); 图3.4线性布局效果图 程序运行结果如图3.4所示,控件按垂直方向逐个排列。 3.2.3相对布局 相对布局(RelativeLayout)是采用相对于其他控件位置的布局方式,该布局内的控件和其他控件存在相对关系,通常通过指定id关联其他控件,以右对齐、上对齐、下对齐或居中对齐等方式来排列控件。 视频讲解 相对布局属性较多,表3.1介绍了几种常用属性。 表3.1相对布局常用属性 属性描述 android:layout_alignParentTop="true|false"是否与父控件的顶部平齐 android:layout_alignParentBottom="true|false"是否与父控件的底部平齐 android:layout_alignParentLeft="true|false"是否与父控件的左边平齐 android:layout_alignParentRight="true|false"是否与父控件的右边平齐 android:layout_centerInParent="true|false"是否在父控件的中间位置 android:layout_centerInHorizontal="true|false"是否水平方向在父控件的中间 android:layout_centerInVertical="true|false"是否垂直方向在父控件的中间 android:layout_alignTop="@id/***"与相应id为***控件的顶部平齐 android:layout_alignBottom="@id/***"与相应id为***控件的底部平齐 android:layout_alignLeft="@id/***"与相应id为***控件的左边平齐 android:layout_alignRight="@id/***"与相应id为***控件的右边平齐 android:layout_above="@id/***" 在id为***控件的上面,该控件的底部与***顶部平齐 android:layout_blow="@id/***" 在id为***控件的下面,该控件的顶部与***底部平齐 android:layout_toRightOf="@id/***" 在id为***控件的右边,该控件的左边与***右边平齐 android:layout_toLeftOf="@id/***" 在id为***控件的左边,该控件的右边与***左边平齐 【例33】演示相对布局编程方法。 (1) 打开LayoutDemo项目,右击res/layout文件夹,选择New→XML→Layout XML File,在弹出的对话框的Layout File Name栏填入layout_relativelayout,在下方的Root Tag栏填入RelativeLayout,创建一个相对布局文件。 (2) 在该布局中放入三个TextView控件,并设置它们之间的相对位置关系,代码如下。 (3) 在MainActivity.java代码中修改与主Activity绑定的布局文件,修改后的代码如下。 setContentView(R.layout.layout_relativelayout); 图3.5相对布局效果图 程序运行结果如图3.5所示。由运行结果可以很明显地看出相对布局的特点,TextView1位于水平方向居中,TextView2位于TextView1下方,TextView3位于TextView2下方且右对齐。 视频讲解 3.2.4约束布局 约束布局(ConstrainLayout)是Android Studio 2.2中新增的功能之一。与传统的XML代码的界面编写方式相反,约束布局使用可视化的方式来编写界面,其结合Android Studio的布局编辑器通过拖曳控件完成布局,有利于解决布局嵌套过多的问题,是现在用得比较多的一种布局方式。 图3.6约束布局效果图 【例34】使用约束布局实现如图3.6所示的用户登录界面。 (1) 打开LayoutDemo项目,打开res/layout/activity_main.xml文件。该布局文件是项目创建的默认的布局文件,采用的是约束布局。 (2) 我们切换到activity_main.xml文件的Design视图,依次将左上Palette面板中的TextView、imageView、Plain Text和Button控件拖到左下ComPonent Tree面板中,每拖一个控件就通过中间的布局界面和右边的Attributes面板对该控件进行调整和属性设置,最后形成如图3.7所示的布局树和布局界面。 图3.7“用户登录”约束布局设计图 该布局的代码如下。