引言
上篇 可以说是一个分水岭,它标志着我们从Android应用程序理论进入实践,我们拿起手术刀对默认的“Hello World!”程序进行了3个手术,我们清楚了“Hello world!”是如何实现显示在屏幕上的,而且我们知道不仅可以根据布局文件main.xml来初始化屏幕,还可编程地进行。以后基本我们都会以实践的方式来深入Android开发。我们这次深入分析Android应用程序的布局文件,主要内容如下:
- 1、用户界面及视图层次
- 2、Android中布局定义方法
- 3、编写XML布局文件及加载XML资源
- 4、常用布局文件中元素的属性
- 4.1、ID属性
- 4.2、布局参数
- 5、布局位置&大小&补距&边距
- 6、又是“Hello World!”
- 6.1、又是“Hello World!”(一)
- 6.2、又是“Hello World!”(二)
- 6.3、又是“Hello World!”(三)
1、用户界面及视图层次
在通过“Hello World!”介绍Android中的布局问题之前,不得不先介绍一下Android中的用户界面,因为布局问题也是用户界面问题之一。在一个Android应用程序中,用户界面通过View 和ViewGroup 对象构建。Android中有很多种Views和ViewGroups,他们都继承自View 类。View 对象是Android平台上表示用户界面的基本单元。
View 类:
extends Object
implements Drawable.Callback KeyEvent.Callback AccessibilityEventSource这个类表示用户界面组件的基本构建块,一个View占据屏幕上的一个矩形区域,并负责绘图和事件处理。View 类是widgets 的基类,widgets 用于创建交互式UI组件(buttons、text fields等)。View 类的直接子类ViewGroup 类是layouts 的基类,layouts 是不可见的容器用户保持其他Views或者其他ViewGroups和定义它们的布局属性。
一个View 对象是一个数据结构,它的属性存储屏幕上一个特定矩形区域的布局参数 和内容 。一个View 对象处理它自己的测度、布局、绘图、焦点改变、滚动、键/手势等与屏幕上矩形区域的交互。作为用户界面中的对象,View也是与用户交互的一个点且交互事件接收器。
在Android平台上,你定义活动的UI使用的View和ViewGroup节点的层次结构如下图所示。根据你的需要这个层次树可以是简单的或复杂的,并且你能使用Android预定义的widgets 和layouts 集合,或者使用自定义的Views。
图1、视图层次结构
为了将视图层次树呈现到屏幕上,你的活动必须调用setContentView() 方法并且传递到根节点对象的引用。Android系统接收这个引用并使用它来验证、测度、绘制树。层次的根节点要求它的孩子节点绘制它自己——相应地每个试图组节点要求调用自己的孩子视图去绘制他们自己。子视图可能在父视图中请求指定的大小和位置,但是父视图对象有最终决定权(子视图在哪个位置及多大)。因为它们是按序绘制的,如果元素有重叠的地方,重叠部分后面绘制的将在之前绘制的上面。
2、Android中布局定义方法
布局是一个活动中的用户界面的架构,它定义了布局结构且存储所有显示给用户的元素。有两种方式可以声明布局,这个我们在上文中已经用了(对应上文 的“Hello World的手术(二)”、“Hello World的手术(三)”)。我们再重温总结一下:
-
方法一、在XML格式的布局文件中声明UI 。Android提供了简易的XML词汇表对应视图类和其子类,诸如 widgets 和 layouts 。
-
方法二、在运行时实例化布局元素 。可以编程地创建View和ViewGroup对象,并操作他们的属性。
Android框架给我们灵活地使用这两个方法之一或两个声明和管理你的应用程序的UI。例如,你可以用XML格式的布局文件定义应用程序默认的布局,包括将显示在屏幕的元素和属性。然后你可以编程地修改屏幕上对象的状态,包括定义在XML文件中的元素。
最常用的是方法一,即用一个XML的布局文件定义自己的布局和表达层次视图。XML提供一种直观的布局结构,类似HTML。XML中的每个元素是一个View或者ViewGroup对象(或继承自他们的对象)。View对象是树中的叶子,ViewGroup对象是树中的分支,这点可以从上面的视图层次树中可以看出。
在XML布局文件中声明UI的优点是:使应用程序的界面 与控制它行为的代码 更好地分离了。UI描述在应用程序代码之外,这意味着你可以修改或调整它而不用修改你的源码并重新编译。例如,你可以为不同的屏幕方向、不同的屏幕大小、不同的语言创建XML布局文件。此外,在XML中声明布局更易地可视化你的UI结构,因此更容易调试问题。
一个元素XML元素的名字对应到一个Java类,因此一个 元素在你的UI中创建一个TextView,一个 元素创建一个LinearLayout的视图组。当你加载一个布局资源时,Android系统初始化这些运行时对象,对应你的布局中的元素。XML元素的属性对应到一个Java类的方法。
3、编写XML布局文件及加载XML资源
使用Android的XML词汇,我们可以快速地设计UI布局及包含的屏幕元素,就像web页面的HTML。每个布局文件必须包含一个根元素,根元素必须是一个View或ViewGroup对象