Android编程指南.doc_第1页
Android编程指南.doc_第2页
Android编程指南.doc_第3页
Android编程指南.doc_第4页
Android编程指南.doc_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Android编程指南Android软件产品开发组目录2一、编程环境搭建31、配置android的开发环境32、配置运行环境43、开发工具介绍51、AndroidManifest.xml 文件62、Activity73、View104、Intent115、Service136、NotificationManager147、Android IDL15三、界面设计171、布局管理器172、数据绑定183、XML设计界面201、参数222、文件233、数据库244、内容提供器245、网络25一、编程环境搭建1、配置android的开发环境先从网上下载SDK,网址为/android/download.html;下载完成之后,解压缩文件到一个合适的路径。一般解压文件夹的命名规则是android_sdk_。在此文件夹下有文件夹tools,samples等其他的文件夹。这个SDK包含了所有的开发工具,不过基本都是字符界面的。Eclipse集成开发环境提供了很好的图形化开发界面,对SDK有很好的支持。现在一般用Eclipse开发Android的应用程序。要用Eclipse开发Android的应用程序,必需要下载Android的Eclispe插件(ADT /android/ADT-0.4.0.zip )才可以把Android的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 install and press Next;4. 在Eclipse的对话框中选者 New local Site ;5. 在弹出的对话框中,选者你的ADT目录。6. 在此步骤是,你应该可以看见你的new site已经在search list(处于被选中状态)。选择Finish;7. 现在已经配置好了ADT了,此时你选择Eclipse菜单WindowReferences ,弹出对话框如上图配置就可以后,选者Apply Ok.2、配置运行环境ADT插件提供了新工程的创建的Wizard,你可以使用它来创建新的工程或者导入一个现存的工程。创建一个工程的步骤如下:1. 选择 FileNewProject2. 选择AndroidAndroid Project, and pressNext3. 在对话框the contents for the project:选择创建新的工程:输入工程名称,Java的类组织包,Activity的名词还有你的程序的显示名称。选择导入现有的工程:选择现有工程的工作目录。现在已经创建了一个工程,下面步骤是如何进行运行它。1. 选择RunOpen Run Dialog.或者RunOpen 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 otheremulator startup options.You can set additional options on the Common tab as desired.最后点击Apply保存当前配置, or pressRunorDebug(as appropriate).3、开发工具介绍用于Eclipse集成开发环境的Android应用开发工具插件:它为Eclipse集成开发环境增加了强大的功能,使得创建和调试Android应用程序更加简单和快速。如果你使用Eclipse来开发Android应用,ADT插件将给你带来极大的帮助: 可以从Eclipse集成开发环境直接访问Android开发工具。例如,ADT允许你直接从Eclipse访问DDMS工具的很多功能,包括截屏、port-forwarding、设置断点、查看线程和进程信息。 它提供一个新的项目向导,用于快速创建一个新的Android应用需要的所有基本文件。 它使构建Android应用的过程自动化和简单化。 它提供一个Android代码编辑器,用于为Android的manifest和资源文件编写有效的XML。 二、Android程序模块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=/apk/res/android在第一个元素中. 该声明使标准Android属性在该文件中得以使用, 该属性为文件的xml元素提供了大部分数据. 大多数AndroidManifest.xml 文件仅包含一个元素, 该元素定了这个程序包内所有应用层面上可用的组件和属性. 下面列出了AndroidManifest.xml 这个文件详细的结构大纲, 描述了所有可用标签。 文件根节点, 描述了程序包的所有内容。在其节点下面内可以放置: 请求一个安全授权, 必须被授予该权限, 您的程序包才能正确的操作. 查看安全模块文档, 了解有关授权的更多信息. 一个manifest可以包含零个或多个这样的节点。 声明一个安全授权, 用来限制哪些应用可以访问您的程序包内的组件和特有机制. 查看安全模块文档, 了解有关授权的更多信息. 一个manifest可以包含零个或多个这样的节点。 描述程序包内应用级别组件的根节点. 该节点能够描述应用程序的全局(和/或)默认属性, 例如标签, 图标, 主题, 需要的授权, 等等. 一个manifest可以包含零个或一个这样的节点(多个application 节点是不允许的). 在该节点下, 可以包含零个或多个以下每个组件的声明: Activity 是应用于用户交互的最主要机制. 当一个应用运行的时候, 用户看到的第一个屏幕就是activity, 并且, 用户所使用的其他绝大多数屏幕(界面)也会是activity。 Service 是一个在后台任意时刻都可以运行的组件. 同activity 标签一样, 你可以选择包含一个或多个元素; ContentProvider组件是用来管理数据持久化及数据发布的, 发布的数据可以被其他的应用访问. 2、ActivityActivity是一个与用户交互的系统模块,几乎所有的Activity都是和用户进行交互的,所以在每个Activity进行初始化的时候,都要执行setContentView (View)函数来指定界面UI。在Activity中有两个重要的函数:onCreate(Bundle)函数是你进行初始化的地方,这个也是执行setContentView(View)函数的地方,setContentView(View)函数可以传入一个由XML编制的UI界面,可以使UI和具体实现完全分离。onPause()函数是处理用户离开当前Activity的地方。更重要的是,任何在当前Activity中的任何改变都要在这个函数中提交。一般是使用ContentProvider来保存数据。当从一个界面跳到另一个界面的时候,实质上是从一个Activity跳转到另一个Activity的时候。使用函数Context.startActivity()来实现。另外,所有的Activity都要在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的生命周期。Activity 的生命周期是被以下的函数控制的。public class Activity extends ApplicationContext protected void onCreate(Bundle icicle); protected void onStart(); 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、IntentIntent是对被执行操作的抽象描述。调用 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 是一系列的可选动作中的一个,这些动作可以在同一块数据上执行。 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 和 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 中的 元素指定。这样,其它应用需要在它们的 manifest 中声明对应的 元素,这样才能启动、停止和绑定到服务。 同时,在执行 IPC 调用之前,服务可以调用 checkCallingPermission(String) 对这次 IPC 调用的权限进行检查。 进程生命周期只要服务被启动或者被客户绑定(建立连接),Android 系统就尽可能维护一个进程来作这个服务的宿主。当系统内存不足的时候,系统需要杀死进程来出让内存。这时候在下列情况下,服务的宿主进程具有较高的优先级: 如果服务已经被启动,它的宿主进程比任何在屏幕上对用户可见的进程都具有更低的优先级;但是比其它所有不可见的进程都具有更高的优先级。通常对用户可见的进程的数量非常少,所以正在运行的服务在绝大多数时候不会被杀死 除非系统的可用内存极其匮乏。 如果有客户绑定在服务上,服务的宿主进程的优先级至少和客户的优先级一样(不会比客户更低)。这意味着如果客户对用户可见,那么服务本身也会被系统认为对用户可见。 在服务的宿主进程中运行有其它应用组件,比如 activity,可以提高整个进程的优先级,而不是仅仅提高服务本身的优先级。 6、NotificationManagerNotificationManager用来通知手机使用者有事件发生的类。用来告诉使用者在后台有一些事情发生了。这些通知可以采用以下一些不同的方式: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),因为用户可能正在录入信息或在做其它什么事情。尽管如此,当仍然显示你想给用户所看的信息时,一个好主意是尽量避免唐突。音量控制和短消息到达提示是两个可以考虑的。每一个通知方法都带一个整型的 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 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() 现在被调用者已经全部实现了,接下来就是如何实现调用者端的操作了。 下面是调用的代码:public class MusicDroid extends Activity private MDSInterface mpInterface;public void onCreate(Bundle icicle) /-bindService(new Intent(MusicDroid.this, MDService.class),mConnection, Context.BIND_AUTO_CREATE); private ServiceConnection mConnection = new ServiceConnection() public void onServiceConnected(ComponentName className, IBinder service) mpInterface = MDSInterface.Stub.asInterface(IBinder) service);public void onServiceDisconnected(ComponentName className) mpInterface = null;从调用的代码可以看出,要想调用Service时,必需还要有一个工具类ServiceConnection,这个可以有两个必须要实现的函数,分别是:public void onServiceConnected(ComponentName className, IBinder service) 此函数在系统启动Service时调用,进行必要时初始化。public void onServiceDisconnected(ComponentName className)此函数在系统断开Service时调用,进行必要的析构操作。 三、界面设计1、布局管理器FrameLayout是最简单的一个布局对象。它被定制为你屏幕上的一个空白备用区域,之后你可以在其中填充一个单一对象 比如,一张你要发布的图片。所有的子元素将会固定在屏幕的左上角;你不能为FrameLayout中的一个子元素指定一个位置。后一个子元素将会直接在前一个子元素之上进行覆盖填充,把它们部份或全部挡住(除非后一个子元素是透明的)。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. 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=vider.Contacts.PeopleColumns.NAME; private Cursor cur = managedQuery(vider.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 me!, ok, false); ; / Now hook into our object and set its onItemClickListener member / to our class handler object. mHistoryView = (ListView)findViewById(R.id.history); mHistoryView.setOnItemClickListener(mMessageClickedHandler); 3、XML设计界面通过代码来设计屏幕显示始终是一件麻烦的事情,Android通过支持XML文档设计屏幕显示来

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论