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类:

extendsObject

implementsDrawable.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的视图组。当你加载一个布局资源时,