Android深入解析用户界面用户界面在一个Android应用程序里,用户接口是一系列的View和ViewGroup对象组合而成。Android有很多种View和ViewGroup对象,他们都继承自View基类。View对象是Android平台用户接口的基本对象。这些view类作为与用户交互的widgets小部件的父类,像文本框和按钮。ViewGroup作为提供各种布局结构的layouts的父类,例如linear线性布局,表格布局和绝对布局。一个view对象是一个数据结构,他存储布局参数和屏幕特定区矩形区域的内容。一个view会处理自己所在屏幕区域的测量、布局、绘制、焦点改变、滚动、和按键手势交互。作为用户交互对象,一个view可以作为用户与系统的交互工具,接收事件。View结构体系在Android平台,你要用到View或ViewGroup的层、节点的方式来定义一个Android用户界面,就像下面的图表,这个层次结构树可以按你的需求变得简单或者复杂。你可以用Android系统已经定义好的小控件或者布局,或者自定义一些。为了能让你的view层次结构在屏幕上渲染,你的activity需要调用setContentView()方法并且传递一个根节点对象的引用。Android系统接收这些配置,并使用他们来进行测量绘制这个树形的视图结构。这个视图结构的根节点要求他的孩子节点自我绘制,反过来说,每个viewGroup节点负责让他们的子节点自我绘制。子节点会在父节点哪里请求到尺寸和位置,但父对象会最终决定他们孩子有多大。Android按顺序解析你的布局上的所有元素,从顶端开始,实例化view并且把他们添加到父对象。因为他们都是按顺序被绘制的,如果某些view超出的显示范围,那么后来绘制的将会覆盖原来的。关于view结构体系怎样绘制,在后面会有详细的讨论。布局通常最多的布局是通过xml来定义。xml提供一个容易阅读的结构,很像html。xml中每个元素都是一个view或者viewGroup对象(或他们的子类)。view在树结构中是叶子节点,ViewGroup对象在非叶子节点。xml元素名代表着各个类。比如TextView元素会创建一个TextView控件,一个LinearLayout会创建一个LinearLayout的viewGroup,当你加载一个布局资源,Android系统会初始化运行时对象,即对应的布局元素。例如,一个简单的垂直布局,里面包含一个textView和一个Button。java代码:?xmlversion=1.0encoding=utf-8?LinearLayoutxmlns:android=:layout_width=fill_parentandroid:layout_height=fill_parentandroid:orientation=verticalTextViewandroid:id=@+id/textandroid:layout_width=wrap_contentandroid:layout_height=wrap_contentandroid:text=Hello,IamaTextView/Buttonandroid:id=@+id/buttonandroid:layout_width=wrap_contentandroid:layout_height=wrap_contentandroid:text=Hello,IamaButton//LinearLayout注意,linearLayout元素包含着TextView和Button。你可以嵌套另外的LinearLayout,来增加view的长度,或者增加一个更复杂的布局。你可以在你的布局里用很多种布局方式,使用很多不同类型的viewGroup,你可以定义无限多的子view或者子viewGroup。android提供一些预先定义好的布局,包括:LinearLayout-线性布局,RelativeLayout-关系布局,TableLayout-表格布局,GridLayout网格布局等。他们提供一些独特的参数用来定义view的位置和布局结构。Widgets小部件widget是一个服务于用户与界面交互的view对象。Android提供很多视图小部件,如按钮、寻则狂、文本输入框、到呢个,你可以很快的构建自己的布局。一些小部件很复杂,像日期选择器,一个时钟,缩放控制。但你不会被Android平台所提供的UI部件所限制,你可以自定义UI部件,可以继承或者结合已经存在的UI部件。UI事件一旦你向界面添加了view或者widget,你可能会想他们怎样与用户进行交互的,这样你就可以执行一些操作。添加UI事件,你需要做两件事情:@定义事件监听器并注册给view。多半情况下,这就是你怎样监听事件:view类包含了一些名如OnXXXListener的监听器,他们都有名为OnXXX()的回调方法。例如:View。onClickListener(这是处理点击事件的),View。onTouchListener(处理触摸事件),View.onKeyListener(处理按键事件),所以如果你想让view响应点击事件,比如按钮被选中,你需要实现OnClickListener接口并且定义回调方法,并且用setOnClickListener()方法来注册View。@覆盖一个已经存在的回调方法:如果你失信了自己的View类并且想要监听一些特殊的事件,那你应该用这种方法。例如,你可以处理屏幕触摸事件,处理滚动球事件,按键等事件。它允许你定义默认的事件,即自定义的view的每个事件,确定这个时间是否会传递到一些字view。然后,他们调用view类的回调函数,所以当你自定义一个组件时才有机会用到这种方法。菜单Menu应用程序菜单是UI的另一个很重要的部分。Menu提供一些可靠的借口来展示程序的功能和一些设置。通常menu是通过按menu键才显示的。然而,你可以让用户按下或者按住某一项时显示menu菜单。menu菜单也遵循view的层次结构,但不要自己定义。取而代之的是,你只需为你的activity定义onCreateOptionsMenu()和onCreateContextMenu()两个回调方法即可,在适当的时间,Android会自动的绘制必要的视图结构并且menu的所包含的子项的。Menu会处理他自己的时间。所以不需要注册事件监听器,当menu中的某一项被选中,系统会调用onOptionsItemSelected()方法或者onContextItemSelected()方法。和应用程序的布局很像,你可以用xml来配置你的menu项。高级特征一旦你了解了创建用户界面的基本原则。你可以浏览一些高级特征来创建更复杂的应用程序接口。适配器Adapters一些时候,你不想用“硬代码”来填充一些view的数据,相反,你想让view绑定额外的数据集。要这样的话,你要定义一个AdapterView,每个子View里的数据都会被适配器填充。适配器视图对象AdapterView是实现的ViewGroup接口,子类是由被给出的适配器对象决定的。适配器就像你的adapter视图和数据源之间的适配器。这里有几种适配器类的实现方式,对于特殊的任务,例如自定义的适配器从一个Cursor来读取数据库的数据,或者一耳光数组适配器从任意一个数组读取数据。风格和主题Styles、Themes你或许不满意标准控件的外观,你可以定制他们的风格和主题来改变他们。@一个style是一个格式化的属性集,你作为布局的其中一个单元来使用他们。例如,你可以定义某些文本的文字大小和颜色作为特殊的view元素。@一个theme主题是应用程序中整个activity的个格式化的属性集。例如,你可以定义窗体的边框和面板的背景,并且设置menu的字体大小和颜色。它可以应用在整个程序里。我们这次深入分析Android应用程序的布局文件,主要内容如下:1、用户界面及视图层次2、Android中布局定义方法3、编写XML布局文件及加载XML资源1、用户界面及视图层次在通过“HelloWorld!”介绍Android中的布局问题之前,不得不先介绍一下Android中的用户界面,因为布局问题也是用户界面问题之一.在一个Android应用程序中,用户界面通过View和ViewGroup对象构建.Android中有很多种Views和ViewGroups,他们都继承自View类.View对象是Android平台上表示用户界面的基本单元.View类:extendsObjectimplementsDrawable.CallbackKeyEvent.CallbackAccessibilityEventSource这个类表示用户界面组件的基本构建块,一个View占据屏幕上的一个矩形区域,并负责绘图和事件处理.View类是widgets的基类,widgets用于创建交互式UI组件(buttons、textfields等).View类的直接子类ViewGroup类是layouts的基类,layouts是不可见的容器用户保持其他Views或者其他ViewGroups和定义它们的布局属性.一个View对象是一个数据结构,它的属性存储屏幕上一个特定矩形区域的布局参数和内容.一个View对象处理它自己的测度、布局、绘图、焦点改变、滚动、键/手势等与屏幕上矩形区域的交互.作为用户界面中的对象,View也是与用户交互的一个点且交互事件接收器.在Android平台上,你定义活动的UI使用的View和ViewGroup节点的层次结构如下图所示.根据你的需要这个层次树可以是简单的或复杂的,并且你能使用Android预定义的widgets和layouts集合,或者使用自定义的Views.为了将视图层次树呈现到屏幕上,你的活动必须调用setContentView()方法并且传递到根节点对象的引用.Android系统接收这个引用并使用它来验证、测度、绘制树.层次的根节点要求它的孩子节点绘制它自己——相应地每个试图组节点要求调用自己的孩子视图去绘制他们自己.子视图可能在父视图中请求指定的大小和位置,但是父视图对象有最终决定权(子视图在哪个位置及多大).因为它们是按序绘制的,如果元素有重叠的地方,重叠部分后面绘制的将在之前绘制的上面.2、Android中布局定义方法布局是一个活动中的用户界面的架构,它定义了布局结构且存储所有显示给用户的元素.有两种方式可以声明布局,这个我们在上文中已经用了(对应上文的“HelloWorld的手术(二)”、“HelloWorld的手术(三)”).我们再重温总结一下:方法一、在XML格式的布局文件中声明UI.Android提供了简易的XML词汇表对应视图类和其子类,诸如widgets和layouts.方法二、在运行时实例化布局元素.可以编程地创建View和ViewGroup对象,并操作他们的属性.Android框架给我们灵活地使用这两个方法之一或两个声明和管理你的应用程序的UI.例如,你可以用XML格式的布局文件定义应用程序默认的布局,包括将显示在屏幕的元素和属性.然后你可以编程地修改屏幕上对象的状态,包括定义在XML文件中的元素.最常用的是方法一,即用一个XML的布局文件定义自己的布局和表达层次视图.XML提供一种直观的布局结构,类似HTML.XML中的每个元素是一个View或者ViewGroup对象(或继承自他们的对象).View对象是树中的叶子,ViewGroup对象是树中的分支,这点可以从上面的视图层次树中可以看出.在XML布局文件中声明UI的优点是:使应用程序的界面与控制它行为的代码更好地分离了.UI描述在应用程序代码之外,这意味着你可以修改或调整它而不用修改你的源码并重新编译.例如,你可以为不同的屏幕方向、不同的屏幕大小、不同的语言创建X