2022年Android编程指南[收 .pdf
Android编程指南Android软件产品开发组名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 26 页 -2 目录一、编程环境搭建.31、配臵 android的开发环境.3 2、配臵运行环境.4 3、开发工具介绍.5 1、AndroidManifest.xml 文件.6 2、Activity.7 3、View.10 4、Intent.11 5、Service.13 6、NotificationManager.14 7、Android IDL.15 三、界面设计.17 1、布局管理器.17 2、数据绑定.18 3、XML 设计界面.20 1、参数.22 2、文件.23 3、数据库 .24 4、内容提供器.24 5、网络.25名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 26 页 -一、编程环境搭建1、配置 android的开发环境先从网上下载SDK,网址为 http:/ 载 完 成 之 后,解 压 缩 文 件 到 一 个 合 适的 路 径。一 般 解 压 文 件 夹的 命 名 规 则 是android_sdk_。在 此 文 件 夹 下 有 文 件 夹tools,samples等其他的文件夹。这个 SDK包含了所有的开发工具,不过基本都是字符界面的。Eclipse集成开发环境提供了很好的图形化开发界面,对SDK 有很好的支持。现在一般用Eclipse开发 Android的应用程序。要用 Eclipse开发 Android的应用程序,必需要下载Android的 Eclispe插件(ADT http:/dl- SDK集成到Eclipse的开发环境中。下载 Eclipse3.2或者 Eclipse3.3,解压之后,如果系统装了JDK1.5或者 1.5 以上版本的就可以直接打开。接下来就是配臵了,步骤如下:1.解压缩 ADT 文件到你的本地目录;2.启动 Eclipse,选择菜单HelpSoftware Updates Find and Install;3.在弹出的对话框中选者Search for new features to installand press Next;4.在 Eclipse的对话框中选者New local Site ;5.在弹出的对话框中,选者你的ADT 目录。6.在此步骤是,你应该可以看见你的new site已经在 search list(处于被选中状态)。选择 Finish;7.现在已经配臵好了ADT 了,此时你选择Eclipse菜单 WindowReferences,弹名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 26 页 -出对话框如上图配臵就可以后,选者Apply Ok.2、配置运行环境ADT插件提供了新工程的创建的Wizard,你可以使用它来创建新的工程或者导入一个现存的工程。创建一个工程的步骤如下:1.选择File New Project 2.选择 Android Android Project,and press Next 3.在对话框the contents for the project:名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 26 页 -选择创建新的工程:输入工程名称,Java 的类组织包,Activity的名词还有你的程序的显示名称。选择导入现有的工程:选择现有工程的工作目录。现在已经创建了一个工程,下面步骤是如何进行运行它。1.选择 Run Open Run Dialog.或者 Run Open Debug Dialog.;2.在左边的列表中,右击 Android Application然后选择New.3.输入一个名称作为当前的配臵。4.On the Android tab,browse for the project and Activity to start.5.On the Emulator tab,set the desired screen and network properties,as well as any other emulator startup options.You can set additional options on the Common tab as desired.最后 点击 Apply保存当前配臵,or press Run or Debug(as appropriate).3、开发工具介绍用于 Eclipse集成开发环境的Android应用开发工具插件:它为Eclipse集成开发环境增加了强大的功能,使得创建和调试Android应用程序更加简单和快速。如果你使用Eclipse来开发 Android应用,ADT 插件将给你带来极大的帮助:可以从Eclipse集成开发环境直接访问Android开发工具。例如,ADT 允许你直接从Eclipse访问 DDMS工具的很多功能,包括截屏、port-forwarding、设臵断点、查看线程和进程信息。它提供一个新的项目向导,用于快速创建一个新的Android应用需要的所有基本文件。它使构建Android应用的过程自动化和简单化。它提供一个Android代码编辑器,用于为Android的 manifest和资源文件编写有效的XML。二、Android程序模块名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 26 页 -1、AndroidManifest.xml 文件AndroidManifest.xml是每一个应用都需要的文件。位于工程文件根目录下,描述了程序包的一个全局变量,包括的 应用组件(activities,services等等)和为每个组件的实现类,什么样的数据可以操作,以及在什么地方运行。这个文件的一个重要数据(概念)是 intent过滤器。这个过滤器描述了何时何种情况下让activity 启动。当一个activity想要执行一个动作,例如打开一个联系人选取屏幕,会创建一个 Intent对象.该对象包含了很多的描述信息,描述了你想做什么操作,你想处理什么数据,数据的类型,以及一些其他的重要信息.Android拿这个Intent的信息与所有应用的intent过滤器比较,找到一个最能恰当处理请求者要求的数据和action的 activity。另 外 还 要 声 明 您 的 应 用 Activities,Content Providers,Services,和Intent Receivers,你也可以在AndroidManifest.xml文件中指定权限和instrumentation(安全控制和测试)。一个 AndroidManifest.xml文件的例子:这里记录了一些通用特性:几乎所有的AndroidManifest.xml 文件(同其他的Android文件一样)都会包含一个命名空间的声明xmlns:android=http:/ 文件仅包含一个元素,该元素定了这个程序包内所有应用层面上可用的组件和属性.名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 26 页 -下面列出了AndroidManifest.xml 这个文件详细的结构大纲,描述了所有可用标签。文件根节点,描述了程序包的所有内容。在其节点下面内可以放臵:请求一个安全授权,必须被授予该权限,您的程序包才能正确的操作.查看安全模块文档,了解有关授权的更多信息.一个 manifest可以包含零个或多个这样的节点。声明一个安全授权,用来限制哪些应用可以访问您的程序包内的组件和特有机制.查看安全模块文档,了解有关授权的更多信息.一个 manifest可以包含零个或多个这样的节点。描述程序包内应用级别组件的根节点.该节点能够描述应用程序的全局(和/或)默认属性,例如标签,图标,主题,需要的授权,等等.一个 manifest可以包含零个或一个这样的节点(多个 application 节点是不允许的).在该节点下,可以包含零个或多个以下每个组件的声明:Activity 是应用于用户交互的最主要机制.当一个应用运行的时候,用户看到的第一个屏幕就是 activity,并且,用户所使用的其他绝大多数屏幕(界面)也会是 activity。Service 是一个在后台任意时刻都可以运行的组件.同 activity 标签一样,你可以选择包含一个或多个元素;ContentProvider组件是用来管理数据持久化及数据发布的,发布的数据可以被其他的应用访问.2、Activity Activity是一个与用户交互的系统模块,几乎所有的Activity都是和用户进行交互的,所以在每个 Activity进行初始化的时候,都要执行setContentView(View)函数来指定界面UI。在 Activity中有两个重要的函数:onCreate(Bundle)函数 是 你进行初 始化的 地 方,这个 也是 执行setContentView(View)函数的地方,setContentView(View)函数可以传入一个由XML编制的 UI 界面,可以使UI 和具体实现完全分离。onPause()函数 是处 理用户 离开 当前Activity的地 方。更 重要 的是,任何 在当前Activity中的任何改变都要在这个函数中提交。一般是使用ContentProvider来保存数据。当从一个界面跳到另一个界面的时候,实质上是从一个Activity跳转到另一个Activity的 时 候。使 用 函 数Context.startActivity()来 实 现。另 外,所 有 的 Activity都 要 在名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 26 页 -AndroidManifest.xml中注册。Activity的生命周期是用Activity stack来管理的。当一个新的Activity启动,就把这个 Activity放在 Stack 的顶部,然后这个Activity就变成了一个运行的Activity。以前运行的 Activity现在被压在Stack的地步,处于Pause 状态。只有Stack顶部的 Activity才可以在前台运行,且处于活动状态。Activity有四种状态:活动状态,当Activity处于 Stack顶时,就是手机当前的现实屏幕,这是Activity就处于 activity或者运行状态。运行但是失去焦点,当 Activity还处于运行状态时,但是屏幕是有另外一个Activity处于文档处于焦点状态,当前的Activity就处于 pause。停止,当Activity被另一个 Activity完全覆盖的时候,就被停止了,其实就是虽然在运行,但是用户却看不见。结束,当Activity处于 pause或者 stop时,系统可以结束Activity,回收资源,这是Activity就是处于结束状态了。处于结束状态的是Activity,如果要使用户可见,只要重启才可以。下面的图表示了Activity的生命周期。名师资料总结-精品资料欢迎下载-名师精心整理-第 8 页,共 26 页 -Activity 的生命周期是被以下的函数控制的。public class Activity extends ApplicationContext protected void onCreate(Bundle icicle);protected void onStart();名师资料总结-精品资料欢迎下载-名师精心整理-第 9 页,共 26 页 -protected void onRestart();protected void onResume();protected void onFreeze(Bundle outIcicle);protected void onPause();protected void onStop();protected void onDestroy();一般的程序都有几个界面,所以一个程序都有几个Activity。在 Activity进行转换的时候需要借助函数 startSubActivity(Intent I,int type);第一个参数为指定的需要跳转的Activity。在这个参数中含包含了原始的Activity需要向跳转的目标Activity需要传递的数据。此数据是使用函数putExtra()放入 Intent;Intent i=new Intent(this,NoteEdit.class);i.putExtra(NotesDbAdapter.KEY_ROWID,id);startSubActivity(i,ACTIVITY_EDIT);3、View 一个界面就是一个Activity,但是界面上会有很多的控件之类的,只要是用户可以看到的,这些东西都是view。一个View占有一个长方形的地方,而且View是可以嵌套的。View 还可以负责响应用户的动作。所有的 View 的结构都是被安排在树形结构中。你既可以在代码中改变View 的结构树,也可以在 XML 文件中去作修改。View 也是所有的布局管理器的基类。在创建一个View 的结构树的时候,一个会有几个你会很感兴趣的操作。设臵属性,比方说一个TextView,应该会有一些属性值和一些函数去设臵比如像字体,颜色等的属性。设臵焦点,使用requestFocus()可以设臵焦点。接下来是最重要的,就是注册监听事件的函数,一个的View都是相应的函数来设臵监听事件。还有一个是设臵可见性的函数。下面的这一段代码是在xml 中配值一个Button,然后再Activity中获得这个Button的实例,然后可以设臵这个Button的监听函数。Xml 中的代码如下:Activity中的代码如下:Button myButton=(Button)findViewById(R.id.my_button);然后是设臵监听函数:myButton,setOnClickListener(new View.OnClickListener()public void onClick(View view)/To-Do );Android框架是负责组织,显示,绘制Views的。一般不直接在View 上调用函数,除非是自己实现一个ViewGroup.4、Intent Intent是 对 被 执 行 操 作 的 抽 象 描 述。调 用startActivity(Intent),可 以 启 动Activity;调 用broadcastIntent(Intent),可 以 把Intent发 送 给 任 何 相 关 的IntentReceiver组件;调用startService(Intent,Bundle)以及bindService(Intent,String,ServiceConnection,int)可以让应用和后台服务进行通信。Intent 提供了一个在不同应用的代码之间进行动态绑定(late runtime binding)的机制。它主要被用来启动Activities,因此可以被看作是Activities之间的粘合剂。Intent 大体上是一个被动数据结构,该数据结构包括被执行动作的抽象描述。Intent 中的主要内容有:action-需 要 被 执 行 的 动 作。比 如VIEW_ACTION,EDIT_ACTION,MAIN_ACTION 等。data-执行动作要操作的数据,在Intent 里用指向数据记录的URI(ContentURI)表示。比如联系人数据库中的一个联系人记录。除了action,data 两个主要属性,Intent 还具有一些其它属性,这些属性也可以被用在 Intent 里:category-类别,被执行动作的附加信息。例如LAUNCHER_CATEGORY 表示Intent 的接受者应该在Launcher 中作为顶级应用出现;而ALTERNATIVE_CATEGORY 表示当前的Intent 是一系列的可选动作中的一个,这些动作可以在同一块数据上执行。名师资料总结-精品资料欢迎下载-名师精心整理-第 11 页,共 26 页 -type-数据类型,显式指定Intent 的数据类型(MIME)。一般上Intent 的数据类型能够根据数据本身进行判定,但是通过设臵这个属性,可以强制采用显式指定的类型而不再进行推导。component-组件,为使用Intent 的组件类指定名称。通常会根据Intent 中包含的其它信息比如action,data/type,categories 进行查找,最终找到一个与之匹配的组件。如果这个属性存在的话,将直接使用它指定的组件,不再执行上述查找过程。指定了这个属性以后,Intent 的其它所有属性都是可选的。extras-额外的附加信息,是其它所有附加信息的集合。使用extras 可以为组件提供扩展信息,比如,如果要发送电子邮件,也就是要执行“发送电子邮件”的动作,可以将电子邮件的标题、正文等保存在extras 里。在 Intent类里定义了多种标准action和 category 常量(字符串),同时应用也可以根据自己的需要进行定义。Intent 有两种主要形式:显式意图:显式意图是指定了component 属性的intents。调用setComponent(ComponentName)或者setClass(Context,Class)可以为intents 设定 component 属性 指定具体的组件类。这些intents 一般不包括包括其它任何信息,它们通常只是用来通知应用启动内部的activities 作为该应用的(当前)用户界面。隐式意图:隐式意图是没有指明comonent 的 intents。这些intents 必须包括足够的信息,这样系统才能确定在所有的可用组件中,对一个intent 来说运行哪一个组件才是最合适的。Intent 解析机制主要是将已安装应用程序包里的Intent-Filter 描述和Intent 进行匹配。如果使用广播发送Intent,还要在已经注册的IntentReceiver 中尽心匹配。更多的相关描述可以在IntentFilter中找到。在解析Intent 的过程中要用到Intent 的三个属性:动作、数据类型和类别。使用这些属性,就可以PackageManager 上查询能够处理当前intent 的合适组件。组件是否合适由 AndroidManifest.xml 文件中提供的intent 信息决定。判断的方法如下:如果intent 指明了要执行的action,组件action 列表中就必须包含着个action,否则不能匹配;如果Intent 没有提供数据类型(type),系统从数据(data)中得到数据类型。和action 一样,组件的数据类型列表中必须包含intent 的数据类型,否则不能匹配。如果 Intent 中的数据不是content:类型的URL,而且Intent 也没有明确指定它的数据类型,将根据Intent中数据的scheme(比如http:or mailto:)进行匹配。同上,Intent 的 scheme 必须出现在组件的scheme 列表中。如果Intent 指定了一个或多个类别,这些类别必须全部出现在组建的类别列表中。比如intent 中包含了两个类别:LAUNCHER_CATEGORY 和名师资料总结-精品资料欢迎下载-名师精心整理-第 12 页,共 26 页 -ALTERNATIVE_CATEGORY,解析得到的组件必须至少包含这两个类别。5、Service 服务是在后台长时间运行的应用组件,不和用户直接进行交互。在每一个服务类在AndroidManifest.xml 文 件 中,必 须 有 一 个 相 应 的 声 明。服 务 必 须 用Context.startService()或者Context.bindService()启动。和其它应用对象一样,服务运行在它们宿主进程的主线程里。这意味着,如果一个服务需要执行阻塞操作(比如网络操作)或者CPU 敏感的操作(比如MP3 播放器),它应该分离出一个线程来执行这样的操作。服务类是应用程序的生命周期中的一个重要部分。在这里要讨论的内容有:服务的生命周期访问权限进程生命周期服务的生命周期启动服务有两种方法。如果客户调用Context.startService(),系统将获得服务(如果服务不存在,系统创建服 务,然 后 调 用 它的onCreate()方 法),然 后 使 用 调 用 者 提供 的 参 数 调用 服 务 的onStart(int,Bundle)方法。从 此 以 后,服务 开始 持 续运 行,直到Context.stopService()或者stopSelf()被调用。注意:多次调用Context.startService()虽然会导致onStart()被多次调用,但是服务本身不会嵌套。所以无论调用多少次Context.startService(),只要调用一次Context.stopService()或者 stopSelf(),服务就会停止运行。客户也可以调用Context.bindService()获得到服务的永久连接。如果服务之前没有启动,一样会创建服务然后调用它的onCreate()方法;但是不会调用它的onStart()方法。服务调用它的getBinder()方法,并且将返回的IBinder 对象传递给客户。连接建立以后,不管客户是否保留这个IBinder 对象的引用,只要连接还存在,服务都会持续运行。通常返回的IBinder 对象是一个由AIDL 实现的复杂接口。服务可以同时被启动和绑定多个连接。在这种情况下,只要服务被启动,或者存在着到这 个 服 务 的 连 接,服 务 都 会 持 续 运 行。当 两 个 条 件 都 不 满 足 时,系 统 调 用 服 务 的onDestroy()方法,服务从此被终止。当onDestroy()返回的时候,所有的清理工作(停止线程,取消已经注册的receivers)都已经完成。访问权限对服务的全局访问权限可以通过服务的manifest 中的 元素指定。这名师资料总结-精品资料欢迎下载-名师精心整理-第 13 页,共 26 页 -样,其它应用需要在它们的manifest 中声明对应的 元素,这样才能启动、停止和绑定到服务。同时,在执行IPC 调用之前,服务可以调用checkCallingPermission(String)对这次 IPC 调用的权限进行检查。进程生命周期只要服务被启动或者被客户绑定(建立连接),Android 系统就尽可能维护一个进程来作这个服务的宿主。当系统内存不足的时候,系统需要杀死进程来出让内存。这时候在下列情况下,服务的宿主进程具有较高的优先级:如果服务已经被启动,它的宿主进程比任何在屏幕上对用户可见的进程都具有更低的优先级;但是比其它所有不可见的进程都具有更高的优先级。通常对用户可见的进程的数量非常少,所以正在运行的服务在绝大多数时候不会被杀死除非系统的可用内存极其匮乏。如果有客户绑定在服务上,服务的宿主进程的优先级至少和客户的优先级一样(不会比客户更低)。这意味着如果客户对用户可见,那么服务本身也会被系统认为对用户可见。在服务的宿主进程中运行有其它应用组件,比如activity,可以提高整个进程的优先级,而不是仅仅提高服务本身的优先级。6、NotificationManager NotificationManager用来通知手机使用者有事件发生的类。用来告诉使用者在后台有一些事情发生了。这些通知可以采用以下一些不同的方式:1.当时间发生时临时显示一个View 对象。2.在状态栏上显示一个图标,并通过图标能过激活。3.打开或闪烁设备上的LED 灯或者通过闪烁背光,播放声音,或者振动提示用户。用 两 种 方 式 可 以 在 屏 幕 上 显 示 一 条 消 息,这 个 消 息 会 在 一 段 时 间 内 消 失:notifyWithView(int,View,int,Notification)和 notifyWithText(int,charSequence,int,Notification);函数 notifyWithText(int,charSequence,int,Notification)方法只是构造一个带提示文字的TextView对象。这些方法也产生了一个Notification对象,该对象是你能够设定一个固定的提示方法和其他的一些属性。如果要使用一个Intent或状态栏单独的提示使用者,可以使用notify()方法。当 提 示 信 息 框(View 对 象)被 显 示 给 使 用 者 时,是 作 为 一 个 浮 动 在 当 前 应 用(application)之上的View 对象出现的。它永远不能接受焦点(focus),因为用户可能正在名师资料总结-精品资料欢迎下载-名师精心整理-第 14 页,共 26 页 -录入信息或在做其它什么事情。尽管如此,当仍然显示你想给用户所看的信息时,一个好主意是尽量避免唐突。音量控制和短消息到达提示是两个可以考虑的。每一个通知方法都带一个整型的id 参数。从应用到系统这个id 参数唯一标识了这次通知,因此,在你的应用里要确保id 唯一。如果你调用一个通知方法,使用当前在用通知的 id 并且传递一组新的通知参数,则该通知将被更新。例如,你传递一个新的状态栏图标,位于状态栏的原先的图标将被新的代替。同样,传递同一个id 给 cancel(int)方法将清除该通知。7、Android IDL 通常每个应用程序都在它自己的进程内运行,但有时需要在进程间传递对象,你可以通过应用程序UI 的方式写个运行在一个不同的进程中的service。在 AndRoid平台中,一个进程通常不能访问其他进程中的内存区域。AIDL为解决进程间通信提供了一套机制。AIDL是一个 IDL 语言,它可以生成一段代码,可以使在一个Android设备上运行的两个进程使用内部通信进程进行交互。如果你需要在一个进程中(例如:在一个 Activity中)访问另一个进程中(例如:一个 Service)某个对象的方法,你就可以使用AIDL 来生成这样的代码来传递各种参数。AIDL IPC的机制是基于接口的,和COM 或 Corba类似,但它是轻量级的。下面介绍如何使用AIDL:1.创建你的AIDL文件,这个文件定义一个接口(YourInterface.aidl),该接口定义了可供客户端访问的方法和属性。注意AIDL的接口文件有一定的语法规则,但是十分简单。2如果你在Eclipse编写的话,这是会自动创建一个Java 类,就是接口文件自动生成的符合 Java 语法规则的接口类。3 实现接口方法-AIDL编译器从你的AIDL接口中使用JAVA 编程语言来创建一个接口。这个接口有一个名为Stub的内部抽象类,它继承接口(并实现供IPC 调用的所必需的几个附加方法)。你必须创建一个类来实现该接口。4 向 客 户 端 开 放 接 口-如 果 你 写 个service,你 应 该 扩 展 该Service并 重 载getBinder()方法来返回一个实现上述接口的类的实例。AIDL语法简单,你可以用来声明一个带一个或多个方法的接口,也可以传递参数和返回值。这些参数和返回值可以是任何类型,甚至是其他的AIDL生成的接口。然而,值得重视的是你必须导入所有的non-bult-in类型,即使他们已经作为接口在其他包里定义了。以下代码是AIDL的一个例子:package com.google.android.sample;interface MDSInterface 名师资料总结-精品资料欢迎下载-名师精心整理-第 15 页,共 26 页 -void playFile(in int position);AIDL 生成一个接口文件,文件名和你的AIDL 文件名一致。如果你使用的是Eclipse插件,AIDL会作为build过程的一部分自动运行。生成的接口包括一个名为Stub的内部抽象类,该类声明了你在aidl 文件中声明的所有方法。实现接口,具体代码如下:MDSInterface.Stub mBinder=new MDSInterface.Stub()void playFile(int position)/To-do sth.;实现接口时有几个原则:抛出的异常不要返回给调用者。IPC调用是同步的。如果你知道一个IPC 服务需要超过几毫秒的时间才能完成地话,你应该避免在Activity/View线程中调用。只有方法才获得支持,换句话就是不支持变量。你不能在 AIDL接口中声明静态属性。现在你已完成了接口的实现,你需要向客户端公开该实现。这就是我们所熟悉的发布服务。发布一个Service,然后继承Service并实现 getBinder()返回一个实现的类的实例。下面是个Service的代码片断,该Service向客户端公了MDSInterface接口。public class MDService extends Service public IBinder onBind(Intent intent)return mBinder;private final MDSInterface.Stub mBinder=new MDSInterface.Stub()现在被调用者已经全部实现了,接下来就是如何实现调用者端的操作了。下面是调用的代码:publicclass MusicDroid extends Activity private MDSInterface mpInterface;publicvoid onCreate(Bundle icicle)名师资料总结-精品资料欢迎下载-名师精心整理-第 16 页,共 26 页 -/-bindService(new Intent(MusicDroid.this,MDService.class),mConnection,Context.BIND_AUTO_CREATE);privateServiceConnection mConnection=new ServiceConnection()publicvoid onServiceConnected(ComponentName className,IBinder service)mpInterface=MDSInterface.Stub.asInterface(IBinder)service);publicvoid onServiceDisconnected(ComponentName className)mpInterface=null;从 调 用 的 代 码 可 以 看 出,要 想 调 用Service时,必 需 还 要 有 一 个 工 具 类ServiceConnection,这个可以有两个必须要实现的函数,分别是:publicvoid onServiceConnected(ComponentName className,IBinder service)此函数在系统启动Service时调用,进行必要时初始化。publicvoid onServiceDisconnected(ComponentName className)此函数在系统断开Service时调用,进行必要的析构操作。三、界面设计1、布局管理器FrameLayout是最简单的一个布局对象。它被定制为你屏幕上的一个空白备用区域,之后你可以在其中填充一个单一对象 比如,一张你要发布的图片。所有的子元素将会固定在屏幕的左上角;你不能为FrameLayout中的一个子元素指定一个位臵。后一个子元素将会直接在前一个子元素之上进行覆盖填充,把它们部份或全部挡住(除非后一个子元素是名师资料总结-精品资料欢迎下载-名师精心整理-第 17 页,共 26 页 -透明的)。LinearLayout根据所设臵的属性值水平或垂直的来排列所有的子元素。子元素是水平或垂直一个挨一个的。如果你设臵的垂直属性,那么整个页面只用一列,不过控件所占的宽度为多少。如果是水平熟悉,那么同理。TableLayout将子元素的位臵分配到行或列中。一个TableLayout由许多的 TableRow组成,每个TableRow都会定义一个row(事实上,你可以定义其它的子对象,这在下面会解释到)。TableLayout容器不会显示row、cloumns或 cell 的边框线。每个row拥有 0个或多个的 cell;每个 cell 拥有一个 View 对象。表格由列和行组成许多的单元格。表格允许单元格为空。单元格不能跨列,这与HTML 中的不一样。下图显示了一个TableLayout,图中的虚线代表不可视的单元格边框。列可以被隐藏,也可以被设臵为伸展的从而填充可利用的屏幕空间,也可以被设臵为强制列收缩直到表格匹配屏幕大小。对于更详细信息,可以查看这个类的参考文档。AbsoluteLayout可以让子元素指定准确的x/y坐标值,并显示在屏幕上。(0,0)为左上角,当向下或向右移动时,坐标值将变大。AbsoluteLayout没有页边框,允许元素之间互相重叠(尽管不推荐)。我们通常不推荐使用AbsoluteLayout,除非你有正当理由要使用它,因为它使界面代码太过刚性,以至于在不同的设备上可能不能很好地工作。RelativeLayout允许子元素指定他们相对于其它元素或父元素的位臵(通过 ID 指定)。因此,你可以以右对齐,或上下,或臵于屏幕中央的形式来排列两个元素。元素按顺序排列,因此如果第一个元素在屏幕的中央,那么相对于这个元素的其它元素将以屏幕中央的相对位臵来排列。如果使用XML 来指定这个layout,在你定义它之前,被关联的元素必须定义。2、数据绑定这部分会提及UI 上面的现实组织.这些组成对象是经典AdapterView类的子类.例如包括图像,数层结构表现.这些对象有2 个通用的任务:数据层的填充用户操作选择典型的方法是用类Adapter来绑定数据到界面的某个部分,既可以是用List 存储的用户自定义数据,也可以是从数据库中查找的结果对象集。/Get a Spinner and bind it to an ArrayAdapter that /references a String array.名师资料总结-精品资料欢迎下载-名师精心整理-第 18 页,共 26 页 -private String fruit=apples,oranges,lemons Spinner s1=(Spinner)findViewById(R.id.fruitlist);s1.setAdapter(new ArrayAdapter(this,R.layout.spinner_1,mStrings);/Load a Spinner and bind it to a data query.private String cols=android.provider.Contacts.PeopleColumns.NAME;private Cursor cur=managedQuery(android.provider.Contacts.People.CONTENT_URI,cols,null,null);s2.setAdapter(new CursorAdapter(cur,this);相应用户事件一般的用户界面的控件都是处理用户响应的事件。/Create a message handling object as an anonymous class.private OnItemClickListener mMessageClickedHandler=new OnItemClickListener()public void onItemClick(AdapterView parent,View v,int position,long id)/Display a messagebox.showAlert(Youve got an event,Clicked