Android编程权威指南(txt+pdf+epub+mobi电子书下载)


发布时间:2020-05-14 10:10:17

点击下载

作者:[美]Bill Phillips Brian Hardy著

出版社:北京图灵文化发展有限公司

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Android编程权威指南

Android编程权威指南试读:

献词

献给Donovan。他很忙,但他知道什么时候该用Fragment。——B.H.

译者序

2007年,苹果公司发布了革命性的iPhone,自此开启了智能手机的新时代。随后,2008年,谷歌公司和开放手机联盟共同开发并推出了Android智能手机。时至今日,移动智能设备不仅深刻影响了智能手机行业,也改变了整个科技产业以及人们生活的方方面面,在全球掀起巨大的移动浪潮。

迎着这股浪潮,国际巨头、创业公司、独立开发者各展身手,奋力搏击,抢登浪潮之巅。苹果一度成了全球市值最高的公司,三星则是卖出了数亿部Android手机。2013年,百度以19亿美元的价格收购了91无线。2014年开春,Facebook更是以190亿美元的天价收购了开发WhatsApp应用仅有50名员工的公司,直接把这股移动浪潮推到了巅峰。

豪不夸张地说,所有这一切都离不开移动软件的开发。目前主流的开发平台是苹果的iOS系统和谷歌的Android系统。凭借精美绝伦的UI、流畅顺滑的交互体验,iOS开发在早期抢占了先机。但如今,谷歌在Android系统UI设计及优化方面的前进步伐已赶超苹果在创新方面的进步。越来越多的软件人开始投身Android应用开发阵营。对于业余爱好者来说,Android还是iOS,喜欢谁就选谁。而对于专业开发人员,果粉也好,Android迷也罢,从职业发展及商业利益角度来说,掌握双平台开发是必须的。

作为荣获2012 Jolt 生产力大奖的iOS编程教程的姊妹篇,Big Nerd Ranch公司再接再厉,推出了这本《Android编程权威指南》。英文版甫一上架立即赢得了Amazon读者的广泛赞誉。本书基于Big Nerd Ranch公司的Bootcamp教程编写而成。Big Nerd Ranch创办于2001年,是美国一家知名IT培训公司,每年为微软、谷歌、Faceboook等行业巨头培养众多专业人才。而BootCamp在英文中原意为美国海军陆战队新兵训练营,应用于IT培训行业中,意指通过全真IT项目实战,培训出像美国海军陆战队员那样优秀的IT人才。

本书适合有一定Java编程经验(至少熟悉Java)并对Android开发感兴趣的读者阅读。本书最大的特点是,从Android应用的基本概念及组成开始介绍直至完成一个复杂实用的谷歌地图应用,作者巧妙地把Android开发所需的庞杂知识、行业实践、编程规范等融入本书,并以一种润物无声的导学方式引领读者轻松完成全书的开发学习。第26章在讲解后台任务和线程时,作者寓教于乐,还精心安排了在鞋店工作的闪电侠案例,既能帮助读者形象地理解复杂抽象概念,又让人印象深刻,难以忘却。类似这样的案例、幽默全书俯拾皆是,还是等读者自己去发掘吧。另外,几乎每章都配有深入学习及难度逐步升级的挑战练习版块。深入学习意在让读者进一步掌握本章关键知识点并指明学习更高级主题的方向;挑战练习能够让读者立即获得练手的机会,通过练习巩固运用所学知识。学完本书,在实际开发中,读者自然而然就会知道该做什么,如何去做以及为什么这样做。

最后,感谢图灵各位编辑老师的辛勤工作,尤其感谢李静老师的细心指导,本书及本人都获益良多。更要感谢的是我的clover和千寻,没有他们的宽容、理解与支持,本书译稿不可能完成。

虽然我已尽力传达原作本意并保证译稿的较高质量,但有时拼写错误、因版本升级而导致某些内容不再适用,甚至是囿于个人水平而犯错的情况再所难免。如果你发现了问题或有好的建议,请批评指正并不吝电邮提交至BNRAndroid@gmail.com或反馈至图灵社区。2014年2月28日于上海

致谢

我们很不安,因为封面上只印了我们两个的名字。事实上,本书能够出版发行,完全是团队合作的成果。我们满怀感激之情。

□ 感谢Chris Stewart和Owen Matthews为本书部分章节提供了大量基础性内容。

□ 感谢我们的同事Chris Stewart和Christopher Moore老师。他们在使用持续更新的教学材料教学时充满耐心,并针对其中的内容提出了改进建议;在我们准备做出重大修订时,他们为我们提供了宝贵的参考意见。

□ 感谢我们的同事Bolot Kerimbaev和Andrew Lunsford。他们提供的反馈意见,在很大程度上促成了我们多用Fragment的决定。

□ 感谢技术审校团队帮我们找出并修正了多处问题。他们是Frank Robles、Jim Steele、Laura Cassell、Mark Dalrymple和Magnus。

□ 感谢Aaron Hillegass。他的绝对信任给了我们很大的源动力,否则我们也没机会出版这本书。(他还为我们提供了资金支持,好人一个。)

□ 感谢我们的编辑Susan Loper。通过她出色的编辑润色,原来程序注释般不修边幅的文稿,一下子变得简洁通畅了,而且那些冷笑话也变得栩栩如生,富有了启发性;原来不太恰当的幽默也变得相得益彰。正是因为她的努力,本书才如此妙趣横生。她告诉了我们在技术写作中,什么叫清晰明白和通俗易懂。

□ 感谢美国航空航天局。相比伟大的太阳系探索工程,本书显得微不足道。

□ 感谢Ellie Volckhausen为本书设计了封面 。

□ 感谢网站的Chris Loper。他设计并制作了本书的纸版、Epub版和Kindle版。他使用的DocBook工具给本书的设计与制作带来了极大便利。

□ 感谢Facebook的员工们。他们在本教程的学习中,为我们提供了很多很好的反馈意见。

最后感谢我们的学员们。限于篇幅,这里无法一一列出他们的名字。在本书的创作过程中,他们帮助我们纠正错误,并提出了宝贵建议。正是他们旺盛的求知欲和不断的困惑,让我们有动力编写这本书,再次表示感谢。

如何学习Android开发

学习Android开发,对每个新手都是一个很大的挑战,就好像在异国他乡学会生存一样。即使会说当地的语言,一开始也绝不会有在家的感觉,因为你不能完全理解周围人理解的东西。原有的知识储备在新环境下可能完全派不上用场。

Android有自己的语言文化,亦即Java语言。但仅掌握Java还远远不够,还需要学习很多新的理论和技术知识来理清头绪,从而指引你穿越陌生的领域。

该由我们登场了。在Big Nerd Ranch,我们相信,要成为一名合格的Android开发人员,必须做到:

□ 着手开发一些Android应用;

□ 彻底理解你的Android应用。

本书将协助你完成以上两件事情,我们已用它成功培训了数百位专业的Android开发人员。本书将指导你完成多个Android应用开发,并根据需要逐步介绍各种理论概念及技术知识。在学习过程中,如果遇到知识疑难点,请勇敢面对,我们也会尽最大努力抽丝剥茧,让你知其然更知其所以然。

我们的教学方法是:在学习理论的同时,就着手运用它们开发实际的应用,而非先学习一大堆理论,再考虑如何将理论应用于实践。

读完本书,你将具备必要的开发经验及知识,成长为一名Android开发者。以此为起点,你就能够进行实际开发并继续深入学习。本书读者对象

使用本书,你需要熟悉Java语言,包括类、对象、接口、监听器、包、内部类、匿名内部类、泛型类等基本概念。

如果你对这些概念感到陌生,那么你很可能在翻到第二页时就已经无法再读下去了。对此,建议先放下本书,找本Java入门书看一看。市面上有很多优秀的Java入门书,你可以基于自己的编程经验及学习风格去挑选。

如果你熟悉面向对象编程,但Java知识已经忘得差不多了,那么阅读本书可能也不会有太大的问题。对于接口、匿名内部类等重要的Java语言点,我们会做必要的简短回顾。建议在学习过程中手边备上一本Java参考书,方便查阅。如何使用本书

本书基于Big Nerd Ranch培训基地的5天教学课程编写而成。课程从基础知识讲起,各章节内容以循序渐进的方式编排,建议不要在章节间跳读,以免学习效果大打折扣。因此本书不适合作为参考书。本书旨在让你跨越学习的初始障碍,能够充分利用其他各种参考资料和代码实例类图书来深入学习。

我们的学员在学习期间也受益于良好的培训环境:专门的培训教室、可口的美食、舒适的住宿条件、动力十足的学习伙伴,以及一位随时答疑解惑的指导老师。

本书读者同样需要类似的良好环境。应保证充足的睡眠,找一个安静的地方开始学习。参考以下建议也很有帮助:

(1) 组织朋友或同事组成兴趣小组学习;

(2) 集中安排时间逐章学习;

(3) 参与本书交流论坛(forums.bignerdranch.com)的讨论;

(4) 寻求Android开发高手的帮助。本书内容

通过本书,我们将学习开发8个Android应用。有些应用很简单,一章即可讲完。有些相对复杂。最复杂的一个应用跨越了13章。通过这些精心编排的应用,可学到很多重要的理论知识和开发技巧,从中获得最直接的开发经验。

□ GeoQuiz

本书第一个应用,通过它学习Android应用的基本组成、activity、界面布局(layout)以及显式intent。

□ CriminalIntent

本书最复杂的应用,用来记录办公室同事的种种陋习。通过本应用学习fragment、master-detail用户界面、list-backed用户界面、菜单选项、相机调用、隐式意图(implicit intent)等内容。

□ HelloMoon

通过阿波罗登月历史事件资料的媒体播放应用,继续深入学习fragment、媒体文件的播放与控制、应用资源及本地化的配置。

□ NerdLauncher

通过个性化启动器的开发,深入学习Android的意图(intent)以及任务(task)的概念知识。(task也可称作Activity栈。)

□ RemoteControl

通过小巧的示例应用,学习使用样式(style),状态列表绘制(state list drawable)以及其他一些工具,创建更吸引人的用户界面。

□ PhotoGallery

通过Flickr网站接口下载并显示照片的客户端应用,借此学习Android服务、多线程、网络内容获取服务等知识。

□ DragAndDraw

简单的画图应用,通过它学习触摸手势事件处理以及创建个性化视图等知识。

□ RunTracker

定位追踪并在地图上显示环城或环球旅行线路的应用。借此应用学习使用定位服务、SQLite数据库、加载器(loader)以及地图调用。挑战练习

大部分章末尾都配备有练习题。可借此机会学以致用,查阅官方文档,锻炼独立解决问题的能力。

我们强烈建议大家完成这些挑战练习。在练习过程中,尝试另辟蹊径,探索自己独特的学习之路,有助于巩固所学知识,增强未来开发应用的信心。

遇到一时难以解决的问题,请随时访问论坛http://forums.bignerdranch.com寻求在线帮助。深入学习

本书部分章末尾还包含一块标注为“深入学习”的内容,针对章节内的知识点,提供深入讲解或更多学习信息。本部分内容不属于必须掌握的部分,但我们也希望大家有兴趣阅读并有所收获。代码风格

有别于其他Android开发学习社区常见的编码风格,我们有着自己的判断与选择,主要体现在以下三个方面。

□ 我们在监听器代码部分使用匿名内部类

这通常取决于个人选择。我们认为使用匿名内部类可以让代码更简练,让监听器实现方法一目了然。不过在高性能要求的场景下,匿名内部类可能会有一些问题,但大多数情况下它们都工作得很好。

□ 自第7章引入fragment后,后续所有用户界面都使用它

这一点,我们有充足的坚持理由。很多Android开发者仍然习惯于开发基于activity的代码。我们不打算墨守成规,相信我们,一旦适应了fragment,使用起来将不会太困难。相比activity,fragment在创建和显示用户界面时具有更加灵活的明显优势,因此值得为此付出努力。

□ 我们开发兼容Gingerbread和Froyo设备的应用

随着Ice Cream Sandwich、Jelly Bean以及随后Key Lime Pie的推出,Android开发平台经历了不断的变化与升级。然而,事实上有半数在用设备依然运行着Froyo或Gingerbread系统。(第6章将介绍以美食命名的各个不同的Android开发版本。)

因而,明知有困难,我们还是特意选择开发向后兼容Froyo或至少是Gingerbread系统版本的应用。尽管在教学以及开发方面,开发最新版本系统应用要更加容易一些,但我们还是希望做好为实际在用设备开发的准备。要知道,目前仍有超过40%的Android设备运行着Gingerbread系统。版式说明

为了方便读者阅读,本书会对某些特定内容采用专门的字体。变量、常量、类型、类名、接口名和方法名会以代码体显示。

所有代码与XML清单也会以代码体显示。需要输入的代码或XML总是以粗体显示。应该删除的代码或XML打上删除线。例如,在下列实现代码里,我们删除了makeText(...)方法的调用,增加了checkAnswer(true)方法的调用。开发必备工具ADT套件

准备开发前,需要Android开发工具(ADT)套件。

该工具套件包括下面这些。

□ Eclipse

一套支持Android开发的集成开发环境。Eclipse本身使用Java代码开发,因此可以安装在PC、Mac、Linux等多个平台。Eclipse用户界面遵循“原生应用观感”法则(native look-and-feel),因此,开发工具界面可能会因系统环境的不同而与本书稍有差异。

□ Android开发工具

Eclipse的一套插件。本书使用的ADT版本号为21.1。请确保使用相同或者更高版本的ADT。

□ Android SDK

最新版本的Android SDK。

□ Android SDK工具以及平台工具

用来测试与调试应用的一套工具。

□ Android模拟器系统镜像

用来支持在不同虚拟设备上开发与测试应用。开发套件的下载与安装

以ZIP格式打包的ADT开发套件可从Android开发者网站下载。

(1) 访问网址http://developer.android.com/sdk/index.html下载开发套件。

(2) 解压文件到指定的安装Eclipse及其他工具的路径。

(3) 在解压缩后的文件中,找到并打开eclipse目录,运行该目录下的Eclipse程序。

如果是Windows系统,若遇到Eclipse无法正常启动的情况,请至网站下载安装JDK6。如仍存在问题的话,请访问网址http://developer.android.com/sdk/index.html寻找相应的帮助信息。下载早期版本的SDK

ADT开发套件自带Android最新版本的SDK与系统模拟器镜像。但若想在Android早期版本上测试应用,还需额外下载相关工具组件。

可通过Android SDK管理器来配置安装这些组件。运行Eclipse,在Window菜单项下选择Android SDK Manager,具体请参见图0-1。图0-1 Andriod SDK管理器

对于Android 2.2(Froyo)及其后的每一个系统版本,建议选择安装以下3个组件:

□ SDK平台;

□ 模拟器镜像;

□ Google API。

下载这些组件需要一定时间,请耐心等待。

通过Android SDK管理器,还可以及时获取Android的更新信息,比如新的系统平台发布或工具版本更新等。硬件设备

尽管模拟器用来测试应用很有用,我还是建议同时准备一台Android设备来运行开发应用。本书最后一个应用需要实体设备支持。第1章Android应用初体验

本章将介绍编写Android应用需掌握的一些新的概念和UI组件。学完本章,如果没能理解全部内容,也不必担心。后续章节还会有更加详细的讲解,我们将再次温习并理解这些概念。

马上要编写的首个应用名为GeoQuiz,它能测试用户的地理知识。用户通过单击True或False按钮来回答屏幕上的问题,GeoQuiz可即时反馈答案正确与否。

图1-1显示了用户点击False按钮的结果。图1-1 正确答案应该是伊斯坦布尔(Istanbul),而不是君士坦丁堡1.1 应用基础

GeoQuiz应用由一个activity和一个布局(layout)组成。

□ activity是Android SDK中Activity类的一个具体实例,负责管理用户与信息屏的交互。应用的功能是通过编写一个个Activity子类来实现的。简单的应用可能只需一个子类,而复杂的应用则会有多个子类。

GeoQuiz是个简单应用,因此它只有一个名为QuizActivity的Activity子类。

QuizActivity管理着图1-1所示的用户界面。

□ 布局定义了一系列用户界面对象以及它们显示在屏幕上的位置。组成布局的定义保存在XML文件中。每个定义用来创建屏幕上的一个对象,如按钮或文本信息。

GeoQuiz应用包含一个名为activity_quiz.xml的布局文件。该布局文件中的XML标签定义了图1-1所示的用户界面。

QuizActivity与activity_quiz.xml文件的关系如图1-2所示。图1-2 QuizActivity管理着activity_quiz.xml文件定义的用户界面

学习了这些基本概念后,我们来创建本书第一个应用。1.2 创建Android项目

首先我们来创建一个Android项目。Android项目包含组成一个应用的全部文件。启动Eclipse程序,选择File→New→Android Application Project菜单项,打开新建应用窗口来创建一个新的项目。

在应用名称(Application Name)处输入GeoQuiz,如图1-3所示。此时项目名称(Project Name)会自动更新为GeoQuiz。在包名处(Package Name)输入com.bignerdranch.android.geoquiz。

注意,以上输入的包名遵循了“DNS反转”约定,亦即将企业组织或公司的域名反转后,在尾部附加上应用名称。遵循此约定可以保证包名的唯一性,这样,同一设备和Google Play商店的各类应用就可以区分开来。图1-3 创建新应用

接下来的四个选项用来配置应用如何与不同版本的Android设备适配。GeoQuiz应用只需使用默认设置,所以现在可以忽略它们。第6章将介绍Android不同版本的差异。

Android开发工具每年会更新多次,因此当前的向导画面看起来可能会与本书略有不同。这一般不是问题,工具更新后,向导画面的配置选项应该不会有太大差别。(如果向导画面看起来大有不同,可以肯定开发工具已进行了重大更新。不要担心,请访问本书论坛http://forums.bignerdranch.com,学习如何使用最新版本的开发工具。)

现在单击Next按钮。

在第二个窗口中,清除已勾选的创建定制启动图标(Create custom launcher icon)选项,如图1-4所示。GeoQuiz应用只需使用默认的启动图标。最后确认创建activity(Create activity)选项已选中。

单击Next按钮继续。

图1-5所示的窗口询问想要创建的activity类型。选择Blank Activity。图1-4 配置项目图1-5 创建新的activity

单击Next按钮。

在应用向导的最后一个窗口,命名activity子类为QuizActivity,如图1-6所示。注意子类名的Activity后缀。尽管不是必需的,但我们建议遵循这一好的命名约定。图1-6 配置新建的activity

为体现布局与activity间的对应关系,布局名称(Layout Name)会自动更新为activity_quiz。布局的命名规则是:将activity名称的单词顺序颠倒过来并全部转换为小写字母,然后在单词间添加下划线。对于后续章节中的所有布局以及将要学习的其他资源,建议统一采用这种命名风格。

保持导航类型(Navigation Type)的None选项不变,单击Finish按钮。Eclipse完成创建并打开新的项目。1.3 Eclipse工作区导航

如图1-7所示,Eclipse已在工作区窗口(workbench window)里打开新建项目。(注意,如是安装后初次使用Eclipse,则需关闭初始的欢迎窗口,才能看到如图所示的工作区窗口。)

整个工作区窗口分为不同的区域,这里统称为视图。

最左边是包浏览器(package explorer)视图,通过它可以管理所有项目相关的文件。

中间部分是代码编辑区( editor )视图。为便于开发,Eclipse默认在代码编辑区打开了activity_quiz.xml文件。

在工作区的右边以及底部还有一些其他视图。通过点击视图名称旁边的x关闭标志,可关闭右边的各种视图,如图1-7所示。底部的视图以分组面板(tab group)形式显示。可通过右上角的控制功能最小化整个分组面板,而不是全部关闭它们。图1-7 调整安排工作区窗口

视图被最小化后,聚缩到了Eclipse工作区边缘区域的工具栏上。移动鼠标到工具栏的任意图标上,即可看到对应视图的名字,点击图标可恢复对应视图。1.4 用户界面设计

如前所述,Eclipse已默认打开activity_quiz.xml布局文件,并在Android图形布局工具里显示了预览界面。虽然图形化布局工具非常好用,但为更好地理解布局的内部原理,我们还是先学习如何使用XML代码来定义布局。

在代码编辑区的底部选择标为activity_quiz.xml的标签页,从预览界面切换到XML代码界面。

当前,activity_quiz.xml文件定义了默认的activity布局。应用的默认布局经常改变,但其XML布局文件却总是与代码清单1-1文件相似。

代码清单1-1 默认的activity布局(activity_quiz.xml)

首先,我们注意到activity_quiz.xml文件不再包含指定版本声明与文件编码的如下代码:

ADT21开发版本以后,Android布局文件已不再需要该行代码。不过,在很多情况下,可能还是会看到它。

应用activity的布局默认定义了两个组件(widget):RelativeLayout和TextView。

组件是组成用户界面的构造模块。组件可以显示文字或图像、与用户交互,甚至是布置屏幕上的其他组件。按钮、文本输入控件和选择框等都是组件。

Android SDK内置了多种组件,通过配置各种组件可获得所需的用户界面及行为。每一个组件是View类或其子类(如TextView或Button)的一个具体实例。

图1-8展示了代码清单1-1中定义的RelativeLayout和TextView是如何在屏幕上显示的。图1-8 显示在屏幕上的默认组件

不过,图1-8所示的默认组件并不是我们需要的,QuizActivity的用户界面需要下列五个组件:

□ 一个垂直LinearLayout组件;

□ 一个TextView组件;

□ 一个水平LinearLayout组件;

□ 两个Button组件。

图1-9展示了以上组件是如何构成QuizActivity活动用户界面的。图1-9 布置并显示在屏幕上的组件

下面我们在activity_quiz.xml文件中定义这些组件。

如代码清单1-2所示,修改activity_quiz.xml文件。注意,需删除的XML已打上删除线,需添加的XML以粗体显示。本书统一使用这样的版式约定。

代码清单1-2 在XML文件(activity_quiz.xml)中定义组件

参照代码清单直接输入代码,就算不理解这些代码也没关系,你会在后续的学习中弄明白的。需要特别注意的是,开发工具无法校验布局XML内容,请避免输入或拼写错误。

根据所使用的工具版本不同,可能会得到三行以android:text开头的代码有误。先暂时忽略它们,以后再去解决这一问题。

将XML文件与图1-9所示的用户界面进行对照,可以看出组件与XML元素一一对应。元素的名称就是组件的类型。

各元素均有一组XML属性。属性可以看作是如何配置组件的指令。

以层次等级视角来研究布局,有助于我们更方便地理解元素与属性的运作方式。1.4.1 视图层级结构

组件包含在视图对象的层级结构,即视图层级结构(view hierarchy)中。图1-10展示了代码清单1-2所示XML布局对应的视图层级结构。图1-10 布局中组件及属性的层级结构

从布局的视图层级结构可以看到,其根元素是一个LinearLayout组件。作为根元素,Linear- Layout组件必须指定Android XML资源文件的命名空间属性为http://schemas.android.com/apk/res/android。

LinearLayout组件继承自View子类的ViewGroup组件。ViewGroup组件是一个包含并配置其他组件的特殊组件。如需以一列或一排的样式布置组件,使用LinearLayout组件就可以了。其他ViewGroup子类还包括FrameLayout、TableLayout和RelativeLayout。

若某个组件包含在一个ViewGroup中,该组件与ViewGroup即构成父子关系。根LinearLayout有两个子组件:TextView和LinearLayout。作为子组件的LinearLayout本身还有两个Button子组件。1.4.2 组件属性

下面我们一起来看看配置组件的一些常用属性。1. android:layout_width和android:layout_height属性

几乎每类组件都需要android:layout_width和android:layout_height属性。它们通常被设置为以下两种属性值之一。

□ match_parent:视图与其父视图大小相同。

□ wrap_content:视图将根据其内容自动调整大小。(以前还有一个fill_parent属性值,等同于match_parent,目前已废弃不用。)

根LinearLayout组件的高度与宽度属性值均为match_parent。LinearLayout虽然是根元素,但它也有父视图(View)——Android提供该父视图来容纳应用的整个视图层级结构。

其他包含在界面布局中的组件,其高度与宽度属性值均被设置为wrap_content。请参照图1-9理解该属性值定义尺寸大小的作用。

TextView组件比其包含的文字内容区域稍大一些,这主要是android:padding="24dp"属性的作用。该属性告诉组件在决定大小时,除内容本身外,还需增加额外指定量的空间。这样屏幕上显示的问题与按钮之间便会留有一定的空间,使整体显得更为美观。(不理解dp的意思?dp即density-independent pixel,指与设备无关的像素,第8章将介绍有关它的概念。)2. android:orientation属性

android:orientation属性是两个LinearLayout组件都具有的属性,决定了二者的子组件是水平放置的还是垂直放置的。根LinearLayout是垂直的,子LinearLayout是水平的。

LinearLayout子组件的定义顺序决定着其在屏幕上显示的顺序。在竖直的LinearLayout中,第一个定义的子组件出现在屏幕的最上端。而在水平的LinearLayout中,第一个定义的子组件出现在屏幕的最左端。(如果设备语言为从右至左显示,如Arabic或者Hebrew,第一个定义的子组件则出现在屏幕的最右端。)3. android:text属性

TextView与Button组件具有android:text属性。该属性指定组件显示的文字内容。

请注意,android:text属性值不是字符串字面值,而是对字符串资源(string resources)的引用。

字符串资源包含在一个独立的名为strings的XML文件中,虽然可以硬编码设置组件的文本属性,如android:text="True",但这通常不是个好方法。将文字内容放置在独立的字符串资源XML文件中,然后引用它们才是好方法。在第15章中,我们将学习如何使用字符串资源轻松实现本地化。

需要在activity_quiz.xml文件中引用的字符串资源目前还不存在。现在我们来添加这些资源。1.4.3 创建字符串资源

每个项目都包含一个名为strings.xml的默认字符串文件。

在包浏览器中,找到res/values目录,点击小三角显示目录内容,然后打开strings.xml文件。忽略图形界面,在编辑区底部选择strings.xml标签页,切换到代码界面。

可以看到,项目模版已经默认添加了一些字符串资源。删除不需要的hello_world部分,添加应用布局需要的三个新的字符串,如代码清单1-3所示。

代码清单1-3 添加字符串资源(strings.xml)(项目已默认配置好应用菜单,请勿删除menu_settings字符串设置,否则将导致与应用菜单相关的其他文件发生版式错误。)

现在,在GeoQuiz项目的任何XML文件中,只要引用到@string/false_button,应用运行时,就会得到文本“False”。

保存strings.xml文件。这时,activity_quiz.xml布局曾经提示缺少字符串资源的信息应该不会再出现了。(如仍有错误信息,那么检查一下这两个文件,确认是否存在输入或拼写错误。)

字符串文件默认被命名为strings.xml,当然也可以按个人喜好任意取名。一个项目也可以有多个字符串文件。只要这些文件都放置在res/values/目录下,并且含有一个resources根元素,以及多个string子元素,字符串定义即可被应用找到并得到正确使用。1.4.4 预览界面布局

至此,应用的界面布局已经完成,现在我们使用图形布局工具来进行实时预览。首先,确认保存了所有相关文件并且无错误发生,然后回到activity_quiz.xml文件,在编辑区底部选择图形布局标签页进行界面布局预览,如图1-11所示。图1-11 在图形布局工具中预览界面布局(activity_quiz.xml)1.5 从布局XML到视图对象

想知道activity_quiz.xml中的XML元素是如何转换为视图对象的吗?答案就在于Quiz-Activity类。

在创建GeoQuiz项目的同时,也创建了一个名为QuizActivity的Activity子类。QuizActivity类文件存放在项目的src目录下。目录src是项目全部Java源代码的存放处。

在包浏览器中,依次展开src目录与com.bignerdranch.android.geoquiz包,显示其中的内容。然后打开QuizActivity.java文件,逐行查看其中的代码,如代码清单1-4所示。

代码清单1-4 QuizActivity活动的默认类文件(QuizActivity.java)(如果无法看到全部类包导入语句,请单击第一行导入语句左边的⊕符号,从而显示全部导入语句。)

该Java类文件包含两个Activity方法:onCreate(Bundle)和onCreateOptionsMenu(Menu)。

暂不用理会onCreateOptionsMenu(Menu)方法,第16章会详细介绍它。

activity子类的实例创建后,onCreate(Bundle)方法将会被调用。activity创建后,它需要获取并管理属于自己的用户界面。获取activity的用户界面,可调用以下Activity方法:

通过传入布局的资源ID参数,该方法生成指定布局的视图并将其放置在屏幕上。布局视图生成后,布局文件包含的组件也随之以各自的属性定义完成实例化。资源与资源ID

布局是一种资源。资源是应用非代码形式的内容,比如图像文件、音频文件以及XML文件等。

项目的所有资源文件都存放在目录res的子目录下。通过包浏览器可以看到,布局activity_quiz.xml资源文件存放在res/layout/目录下。包含字符串资源的strings文件存放在res/values/目录下。

可使用资源ID在代码中获取相应的资源。activity_quiz.xml文件定义的布局资源ID为 R.layout.activity_quiz。

在包浏览器展开目录gen,找到并打开R.java文件,即可看到GeoQuiz应用当前所有的资源ID。R.java文件在Android项目编译过程中自动生成,遵照该文件头部的警示,请不要尝试修改该文件的内容,如代码清单1-5所示。

代码清单1-5 GeoQuiz应用当前的资源ID(R.java)

可以看到R.layout.activity_quiz即来自该文件。activity_quiz是R的内部类layout里的一个整型常量名。

这们定义的字符串同样具有资源ID。目前为止,我们还未在代码中引用过字符串,但如果需要,则应该使用以下方法:

Android为整个布局文件以及各个字符串生成资源ID,但activity_quiz.xml布局文件中的组件除外,因为不是所有的组件都需要资源ID。在本章中,我们只用到两个按钮,因此只需为这两个按钮生成相应的资源ID即可。

要为组件生成资源ID,请在定义组件时为其添加上android:id属性。在activity_quiz.xml文件中,分别为两个按钮添加上android:id属性,如代码清单1-6所示。

代码清单1-6 为按钮添加资源ID(activity_quiz.xml)

请注意android:id属性值前面有一个+标志,而android:text属性值则没有,这是因为我们将要创建资源ID,而对字符串资源只是做了引用。

保存activity_quiz.xml文件,重新查看R.java文件,确认R.id内部类中生成了两个新的资源ID,如代码清单1-7所示。

代码清单1-7 新的资源ID(R.java)1.6 组件的实际应用

既然按钮有了资源ID,就可以在QuizActivity中直接获取它们。首先,在QuizActivity.java文件中增加两个成员变量。

在QuizActivity.java文件中输入代码清单1-8所示代码。(请勿使用代码自动补全功能。)

代码清单1-8 添加成员变量(QuizActivity.java)

文件保存后,可看到两个错误提示。没关系,这点错误马上就可以搞定。请注意新增的两个成员(实例)变量名称的m前缀。该前缀是Android编程所遵循的命名约定,本书将始终遵循该约定。

现在,请将鼠标移至代码左边的错误提示处,可看到两条同样的错误:Button cannot be resolved to a type。

该错误提示告诉我们需要在QuizActivity.java文件中导入android.widget.Button类包。可在文件头部手动输入以下代码:

或者采用下面介绍的便捷方式自动导入。1.6.1 类包组织导入

使用类包组织导入,就是让Eclipse依据代码来决定应该导入哪些Java或Android SDK类包。如果之前导入的类包不再需要了,Eclipse也会自动删除它们。

通过以下组合键命令,进行类包组织导入:

□ Command+Shift+O(Mac系统);

□ Ctrl+Shift+O(Windows和Linux系统)。

类包导入完成后,刚才的错误提示应该就会消失了。(如果错误提示仍然存在,请检查Java代码以及XML文件,确认是否存在输入或拼写错误。)

接下来,我们来编码使用按钮组件,这需要以下两个步骤:

□ 引用生成的视图对象;

□ 为对象设置监听器,以响应用户操作。1.6.2 引用组件

在activity中,可通过以下Activity方法引用已生成的组件:

该方法接受组件的资源ID作为参数,返回一个视图对象。

在QuizActivity.java文件中,使用按钮的资源ID获取生成的对象后,赋值给对应的成员变量,如代码清单1-9所示。注意,赋值前,必须先将返回的View转型(cast)为Button。

代码清单1-9 引用组件(QuizActivity.java)1.6.3 设置监听器

Android应用属于典型的事件驱动类型。不同于命令行或脚本程序,事件驱动型应用启动后,即开始等待行为事件的发生,如用户单击某个按钮。(事件也可以由操作系统或其他应用触发,但用户触发的事件更显而易见。)

应用等待某个特定事件的发生,也可以说该应用正在“监听”特定事件。为响应某个事件而创建的对象叫做监听器(listener)。监听器是实现特定监听器接口的对象,用来监听某类事件的发生。

无需自己编写,Android SDK已经为各种事件内置开发了很多监听器接口。当前应用需要监听用户的按钮“单击”事件,因此监听器需实现View.OnClickListener接口。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载