版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、.android学习笔记(by quqi99 msn: )android platform是一个用于开发移动程序的软件包,它包括了操作系统、中间件及一些关键应用。开发者能使用android sdk为android platform开发应用,这些应用使用java语言书写,运行在虚拟机dalvik(一个专为手机程序开发的基于linux内核的java虚拟机)。/wiki/index.php?title=%e7%bf%bb%e8%af%91%e4%bb%bb%e5%8a%a1%e9%a2%86%e5%8f%96&printabl
2、e=yes /forumdisplay.php?fid=2 1 什么是android1.1 android的特性 应用框架,让一些基础设施得以重用 dalvik虚拟机,专为开发移动程序优化 集成的浏览器,(基于webkit引擎) 优化的图形库,(2d图形库以及基于opengl es 1.0规范的3d图形库) sqlite,用于结构化数据的存储,是一个数据库 多媒体支持,支持多种音频,视频格式(mpeg4, h.264, mp3, aac, amr, jpg, png, gif) gsm技术(依赖具体硬件) bluetooth, edge, 3g,
3、wifi(依赖具体硬件) camera, gps, compass, accelerometer(依赖具体硬件) 丰富的开发环境(debug工具,内存及性能工具,eclipse的插件等)1.2 android的架构 android操作系统的模块如下: 应用:android已集成了一些应用,如邮件客户端,sms程序,日历,地图,浏览器等 应用框架: 程序库: 例行程序 linux内核2 andvoid起步2.1 开发环境配置 使用eclipse + android development tools (adt)插件。在help software updates find and install.
4、中键入更新地址:/android/eclipse/2.2 运行第一个andvoid程序使用eclipse插件 1、建立的工程类型为:andvoid project 2、建立launch configuration. run open run dialog. or run open debug dialog命令行运行程序 1、创建工程 activitycreator .activityname 2、编译。在build.xml所在的目录ant一下。 3、启动模拟器. 运行命令:emulator 4、在模拟器中,切换到
5、主屏幕。 5、在命令行输入: adb install myproject/bin/.apk将其上载至模拟器。 6、在模拟器中选择程序并启动。android需要专门的编译工具来正确的编译资源文件和android程序的其他部分。基于此,你需要为你的程序准备一个专门的编译环境。 andorid的编译过程通常包括编译xml和其他资源文件、创建正确的输入格式。经过编译的android程序是一个.apk文件,.apk文件是一个压缩文件,它其中包含了.dex文件、资源文件、raw data文件和其他文件。 andoriod暂时还不支持用本地代码(c/c+)开发第三方程序。移除andorid程序要移除你安装在
6、模拟器上的程序,你需要通过run adb并删除相应的.apk文件。通过adb shell命令在模拟器上打开一个unix shell,进入目录data/app/,通过命令rm 你程序的名称.apk来移除文件。2.3 调试程序 andvoid用于调试的手段有: ddms,ddms是一个图形化的程序,支持端口转发(因此你可以在程序中设置断点),支持模拟器上的截屏,支持线程和堆栈信息和其他的一些特性。 logcat,dump一份系统消息的日志。这些消息包括模拟器抛出错误时的堆栈跟踪。 android log, 打印日志的类,用来将消息写入模拟器上的日志文件中。如log.v()用于打印verbose级别
7、的日志 traceview,android可以保存一个日志用来记录被调用的方法以及该方法被调用的次数,通过traceview你可以在一个图形化的界面中查看这个日志文件。 可接解设置emulator的设置以方便调试,模拟器上调试和测试的设置 android提供了众多的设置使你可以更容易的调试和测试程序。要进入开发设置页面,在模拟器中转到dev tools development settings。在该设置页面有以下选项: debug app:选择要调试的程序。你不需要设定其关联至调试器,但是设定这个值有两个效果: o 在调试的时候,如果你在一个断点处暂停了过长的时间,这个设定会防止android
8、抛出一个错误 o 这个设定使你可以选择“等待调试器”选项,使程序只有在调试器关联上之后才启动 wait for debugger:阻塞所选的程序的加载直到有调试器关联上,这样你就可以在oncreate()中设置断点,这对于调试一个activity的启动进程是非常重要的。当你对该选项进行了更改,任何正在运行的程序的实例都会被终止。你只有在上面的选项中选择了一个调试程序才能够选中该选项。你一也可以在代码中添加waitfordebugger()来实现同样的功能。 immediately destroy activities:告诉系统一旦一个activity停止了就销毁该activity(例如当and
9、roid释放内存的时候)。这对于测试代码onfreeze(bundle)/oncreate(android.os.bundle)是非常有用的,否则会比较困难。如果你的程序没有保存状态,那么选择这个选项很可能会引发很多问题。 show screen updates:对于任何正在被重绘的screen sections都会在其上闪现一个粉红色的矩形。这对于发现不必要的screen绘制是很有必要的。 show cpu usage:在屏幕上方显示cpu信息,显示有多少cpu资源正在被使用。上方红色条显示总的cpu使用率,它下方绿色的条显示cpu用在compositing the screen上的时间。注
10、意:在没有重启模拟器之前,一旦你开启了该功能就不能关闭。 show screen fps:显示当前的帧率。这对于查看游戏达到的总的帧率是非常有用的。注意:在没有重启模拟器之前,一旦你开启了该功能就不能关闭。 show background:当没有activity screens可见时,显示一个背景模式。一般是不会出现的,仅仅在debug的时候会出现。 设定的选项在模拟器重启之后仍然有效,如果要取消设定的选项,在取消设定以后还要重启模拟器,才能生效。2.4 andvoid中的概念 一个andvoid应用包括四个部分:n activity活动 (个人认为 :类似于jsp, 也相当于swt中的she
11、ll, view则相当于wegiet)n intent receiver (个人认为 :类似于struts action)n service (个人认为 :类似于servlet)n content provider (个人认为 :用于持久化)用上面哪些组件,要在androidmanifest.xml文件中声明。1、 activity. 一个activity是应用中的一个单一的屏幕,它继承自activity类,它将显示由views组成的ui以及响应事件。(个人理解,相当于jsp)2、 intent与intent filters. intent用于从一个屏幕跳到别一个屏幕,描述一个应用想做什么,它
12、的数据结构包括action与data两部分,action如main、view、pick、edit等等, data被表达成一个uri;intentfilter相当于告诉跳到哪个activity,;intentreceiver用于响应事件,虽然它不显示ui,但它可以用notificationmanager去通知用户。它需要在androidmanifest.xml文件中注册,或者是用context.registerreceiver()硬编码。3、 service是一段有生命周期的无ui的代码。4、 content provider, 持久化,例如存储在文件系统中,或者存储在sqlite数据库中。2.
13、5 例子 1,下载例子工程。/android/intro/codelab/notepadcodelab.zip 例如:notepadv1工程是问题工程,notepadv1solution则是相应的解决工程。 2,3个例子的函义如下:通过练习11. 数据库对象的例子程序2. 如何在一个activity初始化的时候创建数据库对象3. 如何为一个activity创建一个pop菜单4. 如何得到一个用户在pop菜单中选择的item 的id5. 如何向一个listview中写入数据通过练习21 如何取得数据集中被选择数据行的id, 注意rows是java的一个l
14、istarray对象,所以它有它的getselection()的方法2 如何调用一个subactivity以及在调用一个subactivity之前应该做些事情。3 要实现一个方法, 当subactivity返回后,应该做些什么4 关于layout。由于android采用mvc的模式, 所以屏幕的布局采用了xml进行定义。一个好的布局会让程序显的更漂亮。可以参考/android/reference/view-gallery.html, 有很多的布局模式可供利用。5 如何创建一个开始的时候代码中不含oncreate()的类,因为到目前为止还没有创建过自己的
15、类,以前看到的类和修改的方法都是已经写好的了。不过这个类也是一个从android.app.activity继承的。创建后还是要通过source override一个oncreate的6 从一个subactivity返回时,在返回之前应该做哪些事情7 如何在androidmanifest.xml中声明一个新的activity8 如何创建一个内部隐含的onclicklister及实现其应有的功能。通过练习31. 除了oncreate()还有哪些和lifecycle有关的方法a.onfreeze():b.onpause()c.onresume()等等2. 大部分程序都有必要考虑lifecycle的问
16、题,应该把下面的这个图记住: 3. 为了不丢失需要保存的信息,要明确的理解activity的各个状态,并相应的给出在各个状态的行为。4开始的时候对于onfreeze()和onpause()有些理解上的困难,要多读几遍doc来会理解。通过额外练习进一步的理解lifecycle和通过手机按键进行操作时的时间和程序状态关系另外,sdk目录下也有一些例子。练习目标:1. 使用listactivities,并使用菜单2. 学习使用操作sqlite数据库3. 使用arrayadapter绑定数据到listview中4. 掌握一些基本的操作,如菜单的显示,菜单命令的处理,增加数据项等。第一步:在sdk中下载
17、获得notepadv1的代码,并导入到eclipse中。导入步骤:a. 在package explorer中,右键选择import./general/existing projects into workspaceb. 点browse按钮,选择notepadv1 的目录,并点okc. 你将会看到notepadv1被列在项目区中,默认会被打勾,如果没有打勾,请手动勾上。d. 点finishe. notepadv1将被列在package explorer中f. 如果有提示关于androidmanifest.xml的错误,请选中此项目,并右键选择android tools-fix project,他
18、将会自动帮你修复错误。第二步:看一下数据库操作类:dbhelper,还是比较简单的,自己看去 :)。第三步:打开res/layout/notepad_list.xml 这个文件,快速的看下就可以了:a., xml文件的固定头b.一个layout的定义,这里是 linearlayout,但不一定是这个,可以是其他的layout第四步:在上面的那个文件中加入: a. listview和textview不会同是显示,如果没有数据,则默认显示textview(这个view里会显示一个字符串)。如果有数据,则会显示listview。b.是默认的关键字,xml解析器将会自动替换这个符号后面的idc.and
19、roid:list 和android:empty 是android平台预定义好的id,如果你想显示空的textview,可以调用setemptyview().第五步:建立一个新文件res/layout/notes_row.xml,文件内容如下:然后保存,r.java下将会自动刷新。第六步改变继承类public class notepadv1 extends listactivity第七步:看一下这三个事件:oncreate():界面初始化的时候调用oncreateoptionsmenu():按了menu按钮的时候调用onoptionsitemselected() :选择了一个菜单项的时候调用第
20、八步:改写oncreate函数: private dbhelper dbhelper; override public void oncreate(bundle icicle) super.oncreate(icicle); setcontentview(r.layout.notepad_list); dbhelper = new dbhelper(this); filldata(); 第九步:在strings.xml 中增加:add item并在notepadv1类中加入:public static final int insert_id = menu.first;改写oncreateopt
21、ionsmenu() override public boolean oncreateoptionsmenu(menu menu) boolean result = super.oncreateoptionsmenu(menu); menu.add(0, insert_id, r.string.menu_insert); return result; 第十步:改写onoptionsitemselected() override public boolean onoptionsitemselected(item item) switch (item.getid() case insert_id:
22、 createnote(); break; return super.onoptionsitemselected(item); 第十一步:实现两个函数:private void createnote() string notename = note + notenumber+; dbhelper.createrow(notename, ); filldata(); private void filldata() / we need a list of strings for the list items list items = new arraylist(); / get all of th
23、e rows from the database and create the item list list rows = dbhelper.fetchallrows(); for (row row : rows) items.add(row.title); / now create an array adapter and set it to display using our row arrayadapter notes = new arrayadapter(this, r.layout.notes_row, items); /指定notes_row视图,作为数据容器。 setlistad
24、apter(notes); 第十二步:运行:run as - android application 2.6 开发工具2.6.1 仿真器 仿真器是在计算机中运行的一个虚拟的移动装置,用它来设计、调试应用。2.6.2 adtadt是一个用于开发andvoid应用的确良eclipse插件,它方便了我们的开发。例如,它让我们方便从eclipse内部访问ddms工具(可用于截屏,管理port-forwarding,设断点,查看线程和进程信息)2.6.3 ddmsddms(dalvik debug monitor service)和dalvik虚拟机集成,将在ide和模拟器起到一个转发服务。用它能管理仿
25、填器或者设备的进程,并且辅助调试。你可用它杀死进程,选择某一进程去debug,产生trace数据,查看堆和线程信息等等。2.6.4 adbadb(andvoid debug bridge)。在命令行操作。它能安装.apk文件到仿真器上等等。用于将文件发送到仿真器。adb(android debug bridge)是android提供的一个通用的调试工具,借助这个工具,我们可以管理设备或手机模拟器的状态。还可以进行以下的操作:1、快速更新设备或手机模拟器中的代码,如应用或android系统升级;2、在设备上运行shell命令;3、管理设备或手机模拟器上的预定端口;4、在设备或手机模拟器上复制或粘
26、贴文件;以下为一些常用的操作:1、安装应用到模拟器:adb install 比较郁闷的是,android并没有提供一个卸载应用的命令,只能自己手动删除:adb shellcd /data/apprm app.apk2、进入设备或模拟器的shell:adb shell通过上面的命令,就可以进入设备或模拟器的shell环境中,在这个linux shell中,你可以执行各种linux的命令,另外如果只想执行一条shell命令,可以采用以下的方式:adb shell command如:adb shell dmesg会打印出内核的调试信息。3、发布端口:你可以设置任意的端口号,做为主机向模拟器或设备的请
27、求端口。如:adb forward tcp:5555 tcp:80004、复制文件:你可向一个设备或从一个设备中复制文件,复制一个文件或目录到设备或模拟器上:adb push 如:adb push test.txt /tmp/test.txt从设备或模拟器上复制一个文件或目录:adb pull 如:adb pull /addroid/lib/libwebcore.so .5、搜索模拟器/设备的实例:取得当前运行的模拟器/设备的实例的列表及每个实例的状态:adb devices6、查看bug报告:adb bugreport7、记录无线通讯日志:一般来说,无线通讯的日志非常多,在运行时没必要去记录
28、,但我们还是可以通过命令,设置记录:adb shelllogcat -b radio8、获取设备的id和序列号:adb get-productadb get-serialno9、访问数据库sqlite3adb shellsqlite32.6.5 aapt aapt(andvoid asset packaging tool),用于创建.apk文件。2.6.6 aidlaidl(andvoid interface description language)用于产生代码。2.6.7 sqlite3用于访问sqlite数据文件。2.6.8 traceview 查看log信息2.6.9 mksdcard
29、 helps you create a disk image that you can use with the emulator, to simulate the presence of an external storage card (such as an sd card2.6.10 dx dx工具用于重写.class字节码到andvoid字节码2.6.11 activitycreator 用于产生ant文件的脚本。当然,若用eclipse插件就不需要它了。2.7 andvoid应用的生命周期在大部份情况下,每个android应用都将运行在自己的linux进程当中。当这个应用的某些代码需
30、要执行时,进程就会被创建,并且将保持运行,直到该进程不再需要,而系统需要释放它所占用的内存,为其他应用所用时,才停止。 android一个重要并且特殊的特性就是,一个应用的进程的生命周期不是由应用自身直接控制的,而是由系统,根据运行中的应用的一些特征来决定的,包括:这些应用对用户的重要性、系统的全部可用内存。 对于应用开发者来说,理解不同的应用组件(特别是activity、service、intent receiver)对应用进程的生命周期的影响,这是非常重要的。如果没有正确地使用这些组件,将会导致当应用正在处理重要的工作时,进程却被系统消毁的后果。 对于进程生命周期,一个普遍的错误就是:当一
31、个intent receiver在它的onreceiveintent()方法中,接收到一个intent后,就会从这个方法中返回。而一旦从这个方法返回后,系统将会认为这个intent receiver不再处于活动状态了,也就会认为它的宿主进程不需要了(除非宿主进程中还存在其它的应用组件)。从而,系统随时都会消毁这个进程,收回内存,并中止其中还在运行的子线程。问题的解决办法就是,在intentreceiver中,启动一个service,这样系统就会知道在这个进程中,还有活动的工作正在执行。 为了决定在内存不足情况下消毁哪个进程,android会根据这些进程内运行的组件及这些组件的状态,把这些进程划
32、分出一个“重要性层次”。这个层次按顺序如下: 1、前端进程是拥有一个显示在屏幕最前端并与使用者做交互的activity(它的onresume已被调用)的进程,也可能是一个拥有正在运行的intentreceiver(它的onreceiveintent()方法正在运行)的进程。在系统中,这种进程是很少的,只有当内存低到不足于支持这些进程的继续运行,才会将这些进程消毁。通常这时候,设备已经达到了需要进行内存整理的状态,为了保障用户界面不停止响应,只能消毁这些进程; 2、可视进程是拥有一个用户在屏幕上可见的,但并没有在前端显示的activity(它的onpause已被调用)的进程。例如:一个以对话框显
33、示的前端activity在屏幕上显示,而它后面的上一级activity仍然是可见的。这样的进程是非常重要的,一般不会被消毁,除非为了保障所有的前端进程正常运行,才会被消毁。 3、服务进程是拥有一个由startservice()方法启动的service的进程。尽管这些进程对于使用者是不可见的,但他们做的通常是使用者所关注的事情(如后台mp3播放器或后台上传下载数据的网络服务)。因此,除非为了保障前端进程和可视进程的正常运行,系统才会消毁这种进程。 4、后台进程是拥有一个用户不可见的activity(onstop()方法已经被调用)的进程。这些进程不直接影响用户的体验。如果这些进程正确地完成了自己
34、的生命周期(详细参考activity类),系统会为了以上三种类型进程,而随时消毁这种进程以释放内存。通常会有很多这样的进程在运行着,因些这些进程会被保存在一个lru列表中,以保证在内存不足时,用户最后看到的进程将在最后才被消毁。 5、空进程是那些不拥有任何活动的应用组件的进程。保留这些进程的唯一理由是,做为一个缓存,在它所属的应用的组件下一次需要时,缩短启动的时间。同样的,为了在这些缓存的空进程和底层的核心缓存之间平衡系统资源,系统会经常消毁这些空进程。 当要对一个进程进行分类时,系统会选择在这个进程中所有活动的组件中重要等级最高的那个做为依据。可以参考activity、service、int
35、entreceiver文档,了解这些组件如何影响进程整个生命周期的更多细节。这些类的文档都对他们如何影响他们所属的应用的整个生命周期,做了详细的描述。2 开发应用2.1 前端ui2.1.1 .屏幕元素的层次 1. views 一个view是android.view.view基础类的一个对象,它是一个有屏幕上特定的一个矩形内布局和内容属性的数据结构。一个view对象处理测量和布局,绘图,焦点变换,滚动条,还有屏幕区域自己表现的按键和手势。 view类作为一个基类为widget(窗体部件)服务,widget-是一组用于绘制交互屏幕元素的完全实现子类。widget处理它们自己的测距和绘图,所以你可以
36、更快速地用它们去构建你的ui。可用到的widget包括text,edittext,inputmethod,button,radiobutton,checkbox,和scrollview。2. viewgroups一个viewgroup是一个android.view.viewgroup类的对象。一个viewgroup是一个特殊的view对象,它的功能是去装载和管理一组下层的view和其他viewgroup,viewgroup让你可以为你的ui增加结构并且将复杂的屏幕元素构建成一个独立的实体。 viewgroup类作为一个基类为layout(布局)服务,layout-是一组提供屏幕界面通用类型的完
37、全实现子类。layout让你可以为一组view构建一个结构。3. a tree-structured ui 在android平台上,你用view树和viewgroup节点来定义一个activity的ui,就如同下面图表一样。这个树可以如你需要那样简单或者复杂,并且你可以使用android的预定义widget和layout或者你自定义的view类型来构建它。 要将屏幕绑定一个树以便于渲染,你的activity调用它的setcontentview()方法并且传递一个参数给根节点对象。一旦android系统获得了根节点的参数,它就可以直接通过节点来无效化,测距和绘制树。当你的activity被激活并
38、且获得焦点时,系统会通知你的activity并且请求根节点去测距并绘制树,根节点就会请求它的子节点去绘制它们自己。每个树上的viewgroup节点都为它的子节点的绘制负责。 正如之前提到的,每个view group都有测量它的有效空间,布局它的子对象,并且调用每个子对象的draw()方法去绘制它们自己。子对象可能会请求获得一个它们在父对象中的大小和位置,但是父对象对于每个子对象的大小和位置有最终的决定权。4. layoutparams:一个子对象如何指定它的位置和大小每个viewgroup类都会使用一个继承于viewgroup.layoutparams的嵌套类。这个子类包含了包含了定义一个子对
39、象位置和大小的属性类型,并且需适用于view group类。 要注意的是,每个layoutparams子类都有它自己赋值的语法。每个子元素必须定义适用于它们父对象的layoutparams,尽管父对象可能会为子元素定义不同的layoutparams。 所有的viewgroup都包括宽和高。很多还包括边界的定义(margin和border)。你可以非常精确地描述宽和高,尽管你并不想经常这么做。更多时候你希望你的view自行调整到适应内容大小,或者适应容器大小。2.1.2.通用布局对象(最普遍的view groups)1. framelayout (上下压着的那种) framelayout是最简单
40、的一个布局对象。它被定制为你屏幕上的一个空白备用区域,之后你可以在其中填充一个单一对象 比如,一张你要发布的图片。所有的子元素将会固定在屏幕的左上角;你不能为framelayout中的一个子元素指定一个位置。后一个子元素将会直接在前一个子元素之上进行覆盖填充,把它们部份或全部挡住(除非后一个子元素是透明的)。 2. linearlayout linearlayout以你为它设置的垂直或水平的属性值,来排列所有的子元素。所有的子元素都被堆放在其它元素之后,因此一个垂直列表的每一行只会有一个元素,而不管他们有多宽,而一个水平列表将会只有一个行高(高度为最高子元素的高度加上边框高度)。linearl
41、ayout保持子元素之间的间隔以及互相对齐(相对一个元素的右对齐、中间对齐或者左对齐)。 linearlayout还支持为单独的子元素指定weight。好处就是允许子元素可以填充屏幕上的剩余空间。这也避免了在一个大屏幕中,一串小对象挤成一堆的情况,而是允许他们放大填充空白。子元素指定一个weight值,剩余的空间就会按这些子元素指定的weight比例分配给这些子元素。默认的weight值为0。例如,如果有三个文本框,其中两个指定了weight值为1,那么,这两个文本框将等比例地放大,并填满剩余的空间,而第三个文本框不会放大。 tip:为了在屏幕上创建一个按比例安排大小的layout,需要根据这
42、个屏幕上每个元素将按什么比例显示,创建一个指定fill_parent,子元素的height或width为0,且为每一个子元素分配weight值的容器对象。下面的两个窗体采用linearlayout,包含一组的元素:一个按钮,几个标签,几个文本框。两个窗体都为布局做了一番修饰。文本框的width被设置为fill_parent;其它元素的width被设置为wrap_content。默认的对齐方式为左对齐。左边的窗体没有设置weight(默认为0);右边的窗体的comments文本框weight被设置为1。如果name文本框也被设置为1,那么name和comments这两个文本框将会有同样的高度。在
43、一个水平排列的linearlayout中,各项按他们的文本基线进行排列(第一列第一行的元素,即最上或最左,被设定为参考基线)。因此,人们在一个窗体中检索元素时,就不需要七上八下地读元素的文本了。我们可以在layout的xml中设置android:baselinealigned=false,来关闭这个设置。3. tablelayout tablelayout将子元素的位置分配到行或列中。一个tablelayout由许多的tablerow组成,每个tablerow都会定义一个row(事实上,你可以定义其它的子对象,这在下面会解释到)。tablelayout容器不会显示row、cloumns或cel
44、l的边框线。每个row拥有0个或多个的cell;每个cell拥有一个view对象。表格由列和行组成许多的单元格。表格允许单元格为空。单元格不能跨列,这与html中的不一样。下图显示了一个tablelayout,图中的虚线代表不可视的单元格边框。 列可以被隐藏,也可以被设置为伸展的从而填充可利用的屏幕空间,也可以被设置为强制列收缩直到表格匹配屏幕大小。对于更详细信息,可以查看这个类的参考文档。4. absolutelayout absolutelayout可以让子元素指定准确的x/y坐标值,并显示在屏幕上。(0, 0)为左上角,当向下或向右移动时,坐标值将变大。absolutelayout没有页
45、边框,允许元素之间互相重叠(尽管不推荐)。我们通常不推荐使用absolutelayout,除非你有正当理由要使用它,因为它使界面代码太过刚性,以至于在不同的设备上可能不能很好地工作。 5. relativelayout relativelayout允许子元素指定他们相对于其它元素或父元素的位置(通过id指定)。因此,你可以以右对齐,或上下,或置于屏幕中央的形式来排列两个元素。元素按顺序排列,因此如果第一个元素在屏幕的中央,那么相对于这个元素的其它元素将以屏幕中央的相对位置来排列。如果使用xml来指定这个layout,在你定义它之前,被关联的元素必须定义。 这是一个relativelayout例
46、子,其中有可视的和不可视的元素。基础的屏幕layout对象是一个relativelayout对象。这个视图显示了屏幕元素的类名称,下面是每个元素的属性列表。这些属性一部份是由元素直接提供,另一部份是由容器的layoutparams成员(relativelayout的子类)提供。relativelayout参数有width,height,below,aligntop,toleft,padding和marginleft。注意,这些参数中的一部份,其值是相对于其它子元素而言的,所以才relativelayout。这些参数包括toleft,aligntop和below,用来指定相对于其它元素的左,上和
47、下的位置。6. summary of important view groups 重要view group摘要,这些对象拥有ui子元素。一些提供可视的ui,另一些只处理子元素的布局。2.1.3 数据绑定 这部分会提及ui有的一些view groups,些组成对象是经典adapterview类的子类.例如包括图像,数层结构表现.这些对象有2个通用的任务: 数据层的填充与用户操作选择 1. 数据层填充 this is typically done by binding the class to an adapter that gets its data from somewhere either
48、a list that the code supplies, or query results from the devices database. / get a spinner and bind it to an arrayadapter that / references a string array.private string fruit = apples, oranges, lemonsspinner s1 = (spinner)findviewbyid(r.id.fruitlist);s1.setadapter(new arrayadapter(this, mstrings);
49、/ 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_url, cols, null, null);s2.setadapter(new cursoradapter(cur, this);2. 用户操作选择 设置类的adapterview.onitemclicklistener 方法监
50、听和捕捉用户的操作事件./ 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)
51、; ;/ now hook into our object and set its onitemclicklistener member/ to our class handler object. mhistoryview = (listview)findviewbyid(r.id.accept_button);mhistoryview.setonitemclicklistener(mmessageclickedhandler);2.1.4使用xml设计你的屏幕显示1. android定义了大量的自定义元素,各自代表了特定的android显示子类。2. 你可以象创建html文档一样,通过保存在
52、应用res/layout/目录下的xml文件中一系列的嵌套标签来设计你的屏幕显示。3. 每个文档描述一个android.view.view这个元素既可以是 一个简单的显示元素,也可以是一个在子节点中包含了一个集合的版面设计的元素,当android编译你的应用时,他将每个文件都编译进android系统。你可以在代码activity.oncreate()实现中通过调用setcontentview(r.layout.layout_file_name)方法加载显示资源。2.1.5 在屏幕元素中设置句柄1.您可以使用activity.findviewbyid来取得屏幕上的元素的句柄. 使用该句柄您可以设
53、置或获取任何该对象外露的值.textview msgtextview = (textview)findviewbyid(r.id.msg); msgtextview.settext(r.string.push_me);2.2 构建组成模块 android应用是由各种各样的组件来构成. 这些组件大部分都是松散联接,你可以精确的描述它们的联接程度,所以组建的联合比单个程序更有结合力. 显然,所有的组件运行在同一个系统进程里面.在这个进程里面创建多线程是可以允许的,并且是常见的.如果你需要,也可以对刚才那个系统进程创建相互独立的子进程.即使会有很多实例运行,但是他们之间互不干扰,这个是很难得的,因为android可以确保代码是进程间透明的. 以下部分是很重要的android apis; androidmanifest.xml 是控制文件,告诉所有由高级组件构成的系统可以做什么.这些高级的组件包括(特殊activities,服务,接收器,第三方提供商).控制文件用来告诉系统如何使用你所创
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度公益慈善晚会活动策划与实施合同4篇
- 2025年度互联网内容提供商ICP证年审全权委托服务合同3篇
- 二零二五年度生物科技研发农民工就业服务合同4篇
- 电子商务平台消费者权益保护2025年度国际协调合同2篇
- 2025年度牛肝菌有机认证与市场拓展合同
- 二零二五版昆明滇池度假区酒店管理合同3篇
- 二零二五年度农业种植劳务作业承包合同范本3篇
- 2025年度塑料管材国际贸易争端解决合同
- 2025年度私立学校校长任期教育科研成果转化合同
- 二零二五年度企业员工期权激励合同范本
- 广东省佛山市2025届高三高中教学质量检测 (一)化学试题(含答案)
- 人教版【初中数学】知识点总结-全面+九年级上册数学全册教案
- 四川省成都市青羊区成都市石室联合中学2023-2024学年七上期末数学试题(解析版)
- 咨询公司绩效工资分配实施方案
- 2024-2025学年人教版七年级英语上册各单元重点句子
- 2025新人教版英语七年级下单词表
- 公司结算资金管理制度
- 2024年小学语文教师基本功测试卷(有答案)
- 未成年入职免责协议书
- 项目可行性研究报告评估咨询管理服务方案1
- 5岁幼儿数学练习题
评论
0/150
提交评论