Android 最基本组成介绍


andbook - Android 编程 由anddev.org 提供 1111 Android 编程 andbook - Android 编程 由 anddev.org 提供 2222 Android 编程 附带教程来自 anddev.org-Community (本文仅供学习交流)原文版权属于 http://www.anddev.org/ Nicolas Gramlich 撰写 张劲锋 译 在 http://andbook.anddev.org 检查最新版本 Download at Pin5i.Com andbook - Android 编程 由anddev.org 提供 3333 目录 序言/如何阅读本文……………………… 5 介绍……………………………………… 6 什么是 Android --一款 GPhone?……… 7 俯瞰 Android………………………………………… 8 开放性……………………………………………………………………… 8 所有应用程序都是平等地创建………………………………………… 9 打破应用程序局限……………………………………………………… 9 快速 & 简单的应用程序开发………………………………………… 9 第一周……………………………………………… 12 Dalvik.equals(Java)==false……………………………… 13 与普通 Java 虚拟机的差异…………………………………………… 13 Android Code Challenge……………… 14 创建 Android 应用程序…………………15 剖析一个 Android 应用程序……………………… 15 Activity…………………………………………………………………15 Intent Receiver…………………………………………………………17 Service…………………………………………………………………17 Content Provider………………………………………………………18 Android 用户界面………………………………… 19 屏幕元素层次…………………………………………………………19 Android UI元素与 Swing UI元素比较………………………………22 AndroidManifest.xml 文件………………23 一般的……………………………………………… 24 ……………………………………………………………… 25 ……………………………………………………… 25 …………………………………………………………… 25 ……………………………………………………… 25 …………………………………………………………… 25 andbook - Android 编程 由 anddev.org 提供 4444 …………………………………………………………… 27 ……………………………………………………………… 27 ……………………………………………………………… 27 ……………………………………………………………… 28 资源和魔幻的 R.java 文件………………29 资源………………………………………………… 29 资源列表……………………………………………………………… 29 在代码中使用资源…………………………………………………… 30 参考资源……………………………………………………………… 31 可选资源和局部化………………………………… 32 魔幻的 R.java……………………………………… 33 Hello World --Andoird 方式…………… 34 安装 Android SDK………………………………… 35 Android 开发工具(ADT)…………………………………………… 35 安装完毕,我们来写点代码………………………… 37 创建一个新 Android 项目…………………………………………… 37 运行你第一个应用程序……………………………………………… 37 UI--Java 方式……………………………………… 45 System.out.println(……)?………………………… 46 LogCat………………………………………………………………… 46 使用 Intent……………………………… 49 启动(子)Activity………………………………………49 在 Java 代码中找到 XML 定义的 View……………………………… 52 为 View 处理点击………………………………………………………53 从子 Activity 返回数值…………………………………………………56 给(子)Activity 传递数据…………………………… 46 重要的 Layout 和 ViewGroup………… 60 RelativeLayout……………………………………… 60 Download at Pin5i.Com andbook - Android 编程 由anddev.org 提供 5555 参考书目………………………………… 61 缺失章节………………………………… 62 社区…………………………………………………… 62 andbook - Android 编程 由 anddev.org 提供 6666 序言////如何阅读本文 本文为以前已经使用 Java 编程并想开始为 Android 平台开发 的开发者编写。我试着尽可能地多的"展开",在合适的每个地 方放上示例代码。我也试着尽可能多的插入很多图片,因为 它们可以活跃学习过程和吸引读者眼球。 但不庆幸的,不是每样都编上代码;你不得不学习一些 Android 平台基础原理来完全理解它。那就是在第一页中描 述的。没有必要通读所有的那些描述页,但那样较好些。你 可以把它当成一种参考。当在"展开"-过程期间你应该读也被 说明了。因此你可以直接从 Hello World--Android 方式开始。 所有你在本文(所有工作空间)中看到的代码可以在以下站点 获得: http://andbook.anddev.org/sources 阅读愉快!! Download at Pin5i.Com andbook - Android 编程 由anddev.org 提供 7777 介绍 2007 年11月12日,开放手机联盟(Open Handset Alliance )1 发布 Google Android SDK,一周前已经宣布。冲击力是难以置 信的,几乎每个 IT/编程相关的报纸放出关于 Android SDK 发布的消息--在这一两天内,Google 组织就以超过 2000 消息 而镇压群雄。 Android 平台的思想是并且一直是一个震惊和一门每天都吸 引越来越多的开发者的课程。尤其是基于 Inten 和甚至可以 替换主页面应用程序开源的架构,该架构正真给予整个平台 很大数量的灵活性。 "Android ——无限想象" 1 Nicolas Gramlich --anddev.org 网站--管理员 andbook - Android 编程 由 anddev.org 提供 8888 什么是 Android---Android---Android---Android---一款 GPhone?GPhone?GPhone?GPhone? 在 Google 发布 Android SDK 之前的几周和几月就有关于一个叫 GPhone 的许多 传言。它被说成是一种由 Google 生产并通过向该设备用户展示敏感-背景广告方 式提供免费通信的移动设备。 图 1 可能的 GPhone 三维图 但是到 2007 年 11 月 5 日 Andy Rubin 宣布:2 "Anroid 平台----更有深意和野心,而不是一个单纯的手机." 开放手机联盟成员 Google 为移动设备发布一套完整的软件:一个操作系统、中 间件和核心移动应用。一周前发布的不是一个最终产品,而是一个很多地方都 没实现的"预览 SDK"。那些主要的新闻站点抓取一些说 Android 平台满是漏洞 并严重丢失文档的开发者的不适。但主要是说 Android 在该领域上比任何一个 别的软件小。 2 Andy Rubin --Google 移动平台主管 Download at Pin5i.Com andbook - Android 编程 由anddev.org 提供 9999 俯瞰Android 让我们开一下 OHA 在他的 Android 平台上强调的: 开放性 "Android 从底层被构建,使开发者可以创造引人注意的手机应用程序充分利用 所有的付费手机,它被建构成正真的开放。例如,一个应用程序可以调用任何一 个手机的核心功能,例如打电话、发送短信或是使用照相机,它允许开发者为 用户创建丰富并身临其境的体验。" 这是真的,作为一个开发者你可以做每样事情,从发送短信只需 2行代码,甚 至替换你手机的主屏幕。你可以几周内容易地创建完整定制的操作系统,不再 提供预置的 Google 应用程序给用户。 "Android 基于开源的 Linux 内核构建。此外,它利用一个定制的虚拟机,这个 虚拟机专门设计来使在手机环境中的内存和硬件资源更完善。Android 会是开源 的;它可以不受限制地扩展来融合新的技术(可移植的、可嵌入的,当这些技 术出现时)。这个平台将会继续促进开发者社区协同工作来创建创新的手机应用 程序。" 这里 Google 谈到了一个名叫 Dalvik 的虚拟机(Dalvik VM),它是一个基于寄存 器的虚拟机,由 Dan Bornstein 和其他 Google 工程师设计编写,是 Android 平 台的一个重要部分。在"基于寄存器"处,我们发现了第一个和普通 Java 虚拟机 (基于堆栈)的不同点。参看"Dalvik.equals(Java)==false"章节来获取更多关于这 个讨论的细节。 andbook - Android 编程 由 anddev.org 提供 10101010 所有应用程序都是平等地创建 让我们开一下 OHA 在他的 Android 平台上强调的: "Android 在手机核心应用程序和第三方应用程序之间美誉不同处。它们所有的 都可以创建来拥有同样访问手机功能的能力,那些手机功能通过应用程序和服务 的一个广阔频谱来提供给用户。拥有基于 Android 平台构建的设备,用户将能够 完全以他们的兴趣爱好来修改定制手机。他们可以清空手机的主页屏幕,拨号程 序的风格,或是任何一个应用程序。他们甚至能用他们自己喜好的照片 View 视 图程序来构建他们的手机去处理所有照片的视图。" 再说一次,这是真实的。开发者可以 100%定制他们的 Android 设备。Android 系统基于被叫做 Intent 的进行通信,这种 Intent 或多或少只是一个 String 字符串 (带有附加数据),这个 String 定义了一个需要处理的动作。为此举例: "android.provider.Telephony.SMS_RECEIVED" 你可以通过大约 5 行定义简单的监听那个 Intent。系统将会识别有超过一个想要 处理处理那个 Intent 的应用程序,并询问用户来选择他/她要哪一个处理那个 Intent。 打破应用程序局限 "Android 打破创建新的、创新的应用程序的局限。例如:开发者可以让个人手机 上的数据和网站上的数据连接--如用户的联系人、日历、地理位置--提供了一个 更有意义的用户体验。开发者可以创建一个应用程序,这个程序可以使用户看到 他们朋友位置和改变后位置,当他们在附近时可以有机会和他们联系。" 快速&&&&简单的应用程序开发 "Android 提供了宽范围的有用类库和工具,用这些可以创建丰富的应用程序, 例如 Android 使开发者可以获得设备的地理位置,并允许设备通过同类对同类的 方式的社交程序和其他设备通信。另外,Android 包括一套完整的工具,这些工 具提供开发者高度的生产力和深度探究他们的应用程序。" Download at Pin5i.Com andbook - Android 编程 由anddev.org 提供 11111111 自从 Web2.0 改革,这让内容丰富的应用程序顷刻间不再是幻想。Android 带来 了未知的开发速度。让我举个例子: 一天,我在 Android 文档中的"DrivingDirections"这个时髦词汇处困惑。 构思完成 图2 Google 驾驶导航仪在 Android 上完成 上图中这个程序的开发过程花了一个半小时!!(包括简单的用户界面和所有你看 到的图像). 你能否在其他手机平台上创建一个如此家喻户晓的经典程序?--不 。 andbook - Android 编程 由 anddev.org 提供 12121212 额外,用几行代码这个程序就能够使用当前流行的 GPS-定位来丰富。 Google 强调 Android 支持基础定位服务的能力。Android 中的 Google Map 如 此整洁,就好像是专为 Android 开发的一样。通过添加 3 行 Android 默认应用 的 Java 代码和 3 行 XML 代码,你就可以综合一个完整的放大和拖拽地图的能 力。 在 Android 中别的易用的好的特性是动画和媒体回放。从m5 版本,Android SDK 就包含了连续和背面的 GeoCoding 和 mp3 添入,支持:ogg-Vorbis,MIDI 和 一些其他格式的回放。 Download at Pin5i.Com andbook - Android 编程 由anddev.org 提供 13131313 第一周 不走运,开发者不得不处理一个不完整实现的预览 SDK(初始发布:"m3-rc20"), 里面甚至一些 SDK 关键部分被证实是不完整的。文档缺失导致 Google 开发组 中出现一个 Android 开发者组织。迟早,你不得不重视来自 Google 的声明: "如果它没有被证实,就不意味着他可用" 许多开发者不了解第一个发布的 SDK 是预览或是开发者预览这个事实,改变了 的API 要得等到。 其他让人厌的漏洞是模拟器声音突变,这个漏洞说是在四周后"m3-r37a"发布中 解决,但还是在一些 m5 安装中出现了。 andbook - Android 编程 由 anddev.org 提供 14141414 Dalvik.equals(Java)==falseDalvik.equals(Java)==falseDalvik.equals(Java)==falseDalvik.equals(Java)==false 为什么叫"Dalvik"?--Dalvik 虚拟机由 Bornstein 命名,在 Eyjaf j ör ður (冰岛) 渔村后面的 Dal ví k,他祖先曾住的地方。 正如你可能听说的一样,Dalvik 是 Android 虚拟机的名称。它是一个执行 Dalvik 可执行格式(*.dex)文件的只直译程序虚拟机,这种.dex 格式使高效存储和 内存映射执行更完善。Dalvik 虚拟机基于寄存器,并能运行被 java 编译器编译 过的 class,这个 class 已经被包含的"dx"工具转换成 Dalvik 自己的格式了。这 个虚拟机运行在 Linux2.6 内核上,虚拟机依靠它来获得底层服务(例如线程管理 和底级内存管理)。Dalvik 虚拟机也被优化在多个实例中以很低的内存空间运行。 各自的虚拟机保护它的应用程序不被其他破坏程序阻碍。 与普通 JavaJavaJavaJava 虚拟机的差异 现在,几乎在任何一个桌面计算机上都可以找到的 Java 虚拟机是基于堆栈的虚 拟机(VM)。另一方面,DalvikVM 是基于寄存器,由于手机处理器为基于寄存 器执行而被优化。基于寄存器的 VM 在程序代价上也允许更快速的执行时间, 哪些程序在编译后会更大。 Download at Pin5i.Com andbook - Android 编程 由anddev.org 提供 15151515 Android Android Android Android 代码挑战竞赛 Android Code Challenge(ADC)是Google 为了鼓励社区为 Android 平台创建超酷 的应用程序的一个策略,通过奖励提交的前 50 名最有前途的应用程序方式进行 挑战竞赛。 图3 Android 开发者挑战竞赛 Logo 当然,Android 开发者挑战竞赛--有总共 100,000,000 美金作为奖励金额,吸引了 更多的软件开发者来创建一系列的正真有用的应用程序。另一边,在 SDK 发布 的第一个重要月份中,许多声音表示,选择 Google 不是一个好的主意,因为它会 导致少量的代码共享,由于许多人害怕和社区共享他们的主意。 有两个挑战竞赛计划: � Android 开发者挑战竞赛 I:截止到 2008 八月 14 日。 � Android 开发者挑战竞赛 II:这部分将在 2008 第二季中期首款基于 Android 手机来临时启动。 Android 开发者挑战竞赛 I中,到八月 14 日前提交的 50 个最有前途的作品将会 被授予 25,000 美金奖励来做后期开发。这些被选中的若接下来符合主要认证鉴 定并通过,有 10 个257,000 金额的奖励和 10 个100,000 金额的奖励。 提交到挑战竞赛的应用程序应该是创新和证明了 Android 平台功能的,像基础定 位服务,媒体消费,游戏和社交关系网络等丰富手机体验的。 andbook - Android 编程 由 anddev.org 提供 16161616 创建 AndroidAndroidAndroidAndroid 应用程序 本章节我们特别集中在创建 Android 应用程序。 AndroidAndroidAndroidAndroid 应用程序剖析 对于一个 Android 应用程序有四种构成部分 � Activity � Intent Receiver � Service � Content Provider 不是每一个的应用程序都需要所有这四个部分,但是你的应用程序将会用这些的 组合来编写。 一旦你决定了你应用程序需要哪些组件,你应该在一个名叫 AndroidManifest.xml 文件中列出它们。这是一个 XML 文件,在里面声明你应用程序组件和它们的功 能和需求是什么。我们将马上讨论,AndroidManifest.xml 负责什么作用。 ActivityActivityActivityActivity Activity 是 Android 四个构建模块中最普通的一个。一个 Acitivity 通常在你应用 程序中是一个单独的屏幕。每一个 Activity 是被实现作为一个继承于 Activity 基 类的单独的类。你的 Class 将要显示一个由 View 和响应事件组成的用户界面。 多数应用程序由多个屏幕组成。例如:一个文本消息发送程序可能有一个显示 要发送信息的联系人列表的屏幕,有一个给选中的联系人编辑短信的屏幕,并 且另外的屏幕显示以前信息或是更改设置。每一个这些屏幕应该作为一个 Activity 被实现。移动到另外的屏幕上是通过启动一个新的 Activity 来完成。由 于一些原因,一个 Activity 可能会向先前的 Activity 返回一个值——例如:一个 让用户选择一个 Photo 的 Activity 将会返回选中的 photo 到 caller 应用程序上。 Download at Pin5i.Com andbook - Android 编程 由anddev.org 提供 17171717 当一个新的屏幕开启,先前的屏幕被暂停并且压入历史堆栈。用户可以向后导航 返回到在历史记录中先前打开的屏幕。当它们遗留不适当时,屏幕也可以选择从 历史堆栈中删除。Andriod 为每一个从 Home 屏幕上运行的每一个应用程序保留 历史堆栈。 Intent Intent Intent Intent 和IntentIntentIntentIntent FilterFilterFilterFilter Android 使用一个名叫 Intent 的特殊类来让应用程序从一个屏幕移动到另一个屏 幕。Intent 描述了一个应用程序想要干什么。Intent 数据结构的两个最重要的部 分是:要响应的action和data。典型的 action值是M AIN(应用程序的入口),VIEW、 PICK、EDIT,等等。Data 表示成一个统一资源定界符(URI).例如:要在浏览器 中查看一个网站,你将创建一个带有 VIEW action 的Intent 和设置了网站 URI 的 data。 有一个名叫 IntentFilter 的相关类。当一个 Intent 是一个有效地请求来做什么事, 一个 IntentFilter 是:一个 Activity(或 Intent receiver,参见下面)能够处理什么 样的 Intent 的描述。一个为个人设计的有能力显示联系人信息的 Activity 应该发 布一个当申请表示一个人的数据时,可以说是知道如何处理 action View 的 IntentFilter。Activity 在AndroidManifest.xml 文件中发布它们的 IntentFilter。 从一个屏幕到另一个屏幕的导航通过解决 Intent 来完成。要向前导航,一个 Activity 调用 startActivity(myInte)。系统接下来查找所有应用程序的 IntentFilter 并选取一个 IntentFilter 最适合 myIntent 的Activity。新的 Activity 被这个让它运 行的 Intent 通知,解决 Intent 的过程发生在运行时候,即当 startActivity()被调用 时。startActivity()提供了两个关键益处: � Activity 可以从其他组件上简单地通过以一个 Intent 格式做请求来重用功能 � Activity 可以在任何时候被一个新的带有相等的 IntentFilter 的Activity 替换 andbook - Android 编程 由 anddev.org 提供 18181818 IntentIntentIntentIntent ReceiverReceiverReceiverReceiver 当你想要在你的应用程序中编码来执行对外部事件的响应,你可以使用一个 IntentReceiver。例如:当电话响铃,或当数据网络可用时,或当午夜时。虽然 IntentReceiver 不显示一个 UI,但它们也许会显示一个通知来提醒用户是否有令 人感兴趣的事件发生。IntentReceiver 也是在 AndroidManifest.xml 中被注册,但 你也可以在代码中使用"Context.registerReceiver()"来注册它们。它的 IntentReceiver 被调用时,你的程序不是非得运行的;假如必要时,当一个 IntentReceiver 被触发时,系统将会调用你的应用程序。通过使用 "Context.broadcastIntent()",应用程序也能发送它们自己的"Intent Broadcast"给别 的应用程序。 ServiceServiceServiceService 一个 service 是长期存活并且运行时不带 UI 的编码。这个 Service 的好例子是 Media Player 从一个播放列表中播放歌曲。在一个 Media Player 应用程序中,可 能有一个或更多的 Activity,这些 Activity 允许用户选择歌曲和开始播放歌曲。 然而,音乐回放本身不应该被一个 Activity 处理,因为用户将期望在导航到一个 新的屏幕后音乐保持播放。这种情况中,Media Player Activity 应该使用 "Context.startServer()"来启动一个服务在后台运行来保持音乐继续播放。接下来 系统将保持音乐回放 Service 运行,直到这个 Service 被停止。(通过阅读 Android 应用程序生命周期,你可以学到更多关于先前给出的系统中的 Service。的信息 。) 记住,你可以使用"Context.bindServer()"方法来连接一个 Service(如果还没有运 行,并开启它)。当连接到一个 Service,你可以通过一个 Service 显露出来的 Interface 来和它通信。对于音乐 Service,这可能允许你暂停、倒回,等等。 ContentContentContentContent ProviderProviderProviderProvider 应用程序可以把他们的数据存储到文件中,一个 SQLite 数据库中,设置中,或 是任何其他的有意义结构中。如果你想要你的应用程序的数据和其他应用程序共 享,一个 Content Provider 是有用的。一个 Content Provider 是一个类,它实现了 方法的一个标准设置来让其他应用程序存储和恢复被 Content Provider 处理的数 据类型。 Download at Pin5i.Com andbook - Android 编程 由anddev.org 提供 19191919 AndroidAndroidAndroidAndroid 用户界面 (UI)(UI)(UI)(UI) Android 中的用户界面可以用两种方式来创建,通过定义 XML-代码 或通过编写 Java-代码。在 XML 中定义 GUI 结构是非常好的,因为正如你从 MVC(Model- Viewer-Control)原理中所知的,UI应该总是从项目逻辑中分离出来。另外,使一 个项目从一个屏幕到另一个更加简单了。 在XML 中定义一个 UI是和创建一个普通的 HTML文件非常相似,这个文件是 你有的,换而言之,如此简单的文件: 和Android 的XML-布局一样。每一样结构好并且能够通过树形结构来表达。 Page Title The content of the body element. andbook - Android 编程 由 anddev.org 提供 20202020 屏幕元素层次 Android 应用程序基本功能单元是 Activity——一个 android.app.Activity 类的物件 (Object)。一个 Activity 能够做许多事情,但是通过它自己它不会出现在屏幕上。 为了让你的 Activity 出现在屏幕上和设计它的 UI,你使用 View 和 ViewG roup(— —表现在 Android 平台上的基本用户界面单元)来工作。 ViewViewViewView 一个 View 是一个继承于 android.view.View 基类的物件。它是一种数据结构,它 的属性为一个特殊的屏幕矩形域存储布局(layout)和 Content。一个 View 物件 处理它描绘的屏幕区域的尺寸、布局、绘制、焦点改变、翻屏和按键或手势。 View 类作为一个基类为所有的 widget——一系列完整实现的绘制交互屏幕元素 的子类服务。Widget 处理它们自己的尺寸和绘制,因此,你可以使用它们来更 快速地构建你的 UI。可获得的 widget 列表包括:(换言之)TextView、EditView、 Button、RadioButton、Checkbox、ScrollView,…… ViewgroupViewgroupViewgroupViewgroup 一个 Viewgroup 是一个 android.view.Viewgroup 类物件。顾名思义,一个 viewgroup 是一个特殊类型的 view 物件,它的功能是用来包含和管理一系列下属 view 和其 他 viewgroup,Viewgroup 让你给你的 UI 添加结构和构建起复杂的可以称为一个 单独的实体屏幕元素。 Viewgroup 类作为一个基类为 layout——一系列完整实现的提供普通类型屏幕元 素的子类服务。Layout 给你一种方式来为一系列 view 创建一个结构。 Download at Pin5i.Com andbook - Android 编程 由anddev.org 提供 21212121 树形结构 UIUIUIUI 在Android 平台上,如下图所示,你使用一个树形 View 和Viewgroup 节点定义 一个 Activity 的UI。这个树形可以简单或复杂,如你所需来创建它,并且你可以 使用 Android 一系列的预定义 Widget 和Layout 或是你自己创建的 Custom View 类型来构建它。 图 4 Android UI——树形结构 为了描述把树和屏幕联系起来,你的Activity 调用它的 setContentView()方法和传 递一个树形根节点物件的引用。一旦Android 系统拥有这个树形根节点引用物件 , 它就可以直接使用该节点来工作,使无效、尺寸度量和绘制树。当你的 Activity 变成激活和聚焦,系统通知你的 Activity 并请求根节点度量尺寸并绘制出树。根 节点接着请求它的子节点轮流绘制子节点自己,树中每一个 Viewgroup 节点有责 任绘制它直系子节点。 如前面陈述,每一个 Viewgroup 有责任度量它的可用空间尺寸,布局它的子节点 , 并在每个子节点上调用 draw()来它表述自己。子节点可能会在父节点中请求一个 尺寸和位置,但是父物件有每一个子 View 放哪里、有多大的最终决定权。 andbook - Android 编程 由 anddev.org 提供 22222222 AndroidAndroidAndroidAndroid UIUIUIUI 元素与 SwingSwingSwingSwing UIUIUIUI 元素比较 一些正在阅读本文、大概已经用 SwingUI 编过程的开发者会觉得 Android 和 SwingUI 元素有一些相似。 � Activity 在 Android 中差不多和 Swing 中的(J)Frame 相参考 � View 在 Android 中和 Swing 中的(J)Components 相参考 � TextView 在 Android 中和 Swing 中的(J)Lable 相参考 � EditText 在 Android 中和 Swing 中的(J)TextField 相参考 � Button 在 Android 中和 Swing 中的(J)Button 相参考 在 Android 中给一个 View 设置监听器和在 Swing 中几乎相同。 //A n d r o i d myView.setOnClickListener(n e wne wn e wn e wOnClickListener(){... //S w i n g myButton.addActionListener(n e wne wn e wn e wActionListener() {... Download at Pin5i.Com andbook - Android 编程 由anddev.org 提供 23232323 AndroidManifest.xmlAndroidManifest.xmlAndroidManifest.xmlAndroidManifest.xml AndroidManifest.xml 是所有 Android 应用程序必须的文件。它位于应用程序的根 目录中,并且为你的套件描述全局变量,包括套件向外界暴露的应用程序组件 (Activity、Service、等等),你的每个 Activity 和co.可以处理什么样的数据,和 它们如何被运行。 该文件提及到一个重要的事情是它调用 IntentFilter。这些 Filter(过滤器)描述了哪 里和什么时候 Activity 能够启动。当一个 Activity(或是操作系统)想要执行一个动 作,例如打开网页或是打开一个选择联系人屏幕,它创建一个 Intent 对象。这个 Intent-对象能够保存许多描述了你要干什么的信息,什么数据需要完成和其他小 信息。Android 在一个 Intent 对象中使用每个应用程序暴露出来的 IntentFilter 比 较这个信息,并找出最适合的Activity来处理这个数据或是被拨号器指定的动作 。 假如有超过一个应用程序能够处理那个 Intent,Android 就会询问用户喜好哪一 个应用程序来处理它。 除了声明你应用程序的 Activity、Content Provider、Service 和Intent Receiver,你 也可以在 AndroidManifest.xml 中指定许可。 andbook - Android 编程 由 anddev.org 提供 24242424 一般的 一个非常简单的 AndroidManifest.xml 文件像这样的: � 几乎每一个 AndroidManifest.xml(也包含许多 Android XML 文件)在它第一个 元素中都会包括名字空间声明 (xmls:android=http://schemas.android.com/apk/res/android)。这样在该文件中做了一 种标准的 Android 属性值。这个属性将会用来为该文件中元素支持多数数据。 � 几乎每一个 Manifest 都包括了一个单独的标签,该标签会包含 许多描述在本程序中可用的 Application(应用程序)、IntentReceiver,等等的标 签。 � 如果你想要让一个 Activity 通过用户可直接运行,你将需要让他支持 MAIN 动作和 LAUNCHER category(种类),它的结果如下所示: 图 5555 可直接运行的 ActivityActivityActivityActivity < ?x m lv e r s i o n=" 1 . 0 "e n c o d i n g=" u t f - 8 "? > < /intent-filter> < /a c t i v i t y> < /application> < /m a n i f e s t> Download at Pin5i.Com andbook - Android 编程 由anddev.org 提供 25252525 以下是一个AndroidManifest 文件结构的详细列表,描述了所有可用的标签 , 每一个附有示例: 这是每一个 AndroidManifest.xml 的根节点。它包含了指向任何包里面 Activity 外 层的套件属性。其他的 Activity-路径将会 c对的基于它的值。 描述一个为了让你应用程序操作正确(换句话说,当你想要发短信或是使用电话 练习薄时)它必须被授予的安全许可。在安装你的应用程序期间,这个许可通过 用户授予。数量级:0 声明一个安全许可,可以用来限制哪些应用程序可以访问你套件中的组件和特性 (或其他的)。数量级:0 声明一个编排组件的代码,它可用来测试组件的功能或是其他套件。参看更多 instrumentation 的详细内容。数量级:0 根元素,包含了套件中包含的应用程序级组件的声明。该元素也可以为应用程序 包括全局且/或默认属性,例如一个 Label 文本标签,icon,theme 主题,必须的 许可,等。数量级:0 或1 + + + andbook - Android 编程 由 anddev.org 提供 26262626 你可以把 0 替换成下面的每个子元素: 一个 Activity 是应用程序和用户交互的主要事物。当运行一个应用程序时用户看 到的首显屏幕是一个 Activity,并且多数用户使用的其他屏幕将会作为独立的 Activity 通过添加 Activity 标签声明被实现。 注意:不论它被展露给世界或只是有意在它自己套件中使用,每 一个 Activity 在 Manifest 中必须含有一个标签。如果一个 Activity 在 Manifest 中没有符合的 Activity 标签,你将不能运行它。 随意地,为了支持新的运行时更新,你可以包含 1 元素来声明该 Activity 支持的动作。 声明了一个组件支持什么类型的 Intent。除了多种能在这个元素下被说明的值以 外,这里给出的属性也可以为已经描述的动作 action 支持一个单独的 label、icon 和其他信息。 一个该组件支持的动作类型。例如: + + Download at Pin5i.Com andbook - Android 编程 由anddev.org 提供 27272727 一个该组件支持的 category 类型。例如: 一个该组件支持的 MIME 类型,URI 体系、URI 权威或路径。 你也可以用你的 Activity 来联合 1 个meta-data 片段: 添加一个meta-data片段到Activity中,客户可以通过ComponentInfo.metaData 来检索。 一个 IntentReceiver 允许一个应用程序被告知交换数据和发生的动作,即使它现 在没有运行。因为有了 Activity 标签,你可以随意地包括 1 个元 素,这个是该 Receiver 支持的或是值,就像 一样。 一个 Service 是一个任意时间量内可以在后台运行的组件。由于有了 Activity 标 签,你可以随意包含一个或多个元素,这个是该 Service 支持的或是值;更多信息参看 Activity 的 描述。 一个 ContentProvider 是一个管理持续数据并发布它来让其他应用程序访问。你一 可以随意附加一个或多个值,正如Activity 的描述一样描 写。 当然,所有标签不得不使用或是直接地来结束。 + + andbook - Android 编程 由 anddev.org 提供 28282828 资源和魔幻的 R.javaR.javaR.javaR.java 文件 一个项目的资源和 R.java 是非常紧密相关的。 资源 资源是被你代码使用和在构建时编译进你的应用程序中的额外的文件(非代码文 件 )。Android 支持一些不同种类的资源文件,包括 XML、PNG 和 JPEG 文 件 。 XML 文件根据它们描述的不同而有不同的格式。资源比源代码更具体化,XML 文件被编译成二进制码,由于高效的原因,这是快速加载的格式。字符串被压缩 进更高效的存储格式中。 资源列表 资源类型和它们存放位置: � 布局文件 "/res/layout/" � 图片 "/res/drawable/" � 卡通动画 "/res/anim/" � 风格、字符串、数组 "/res/values/" ○ 名称不是必须严格的像这样: ○ 'arrays.xml' 定义数组 ○ 'colors.xml' 定义颜色 � #RGB #ARGB #RRGGBB #AARRGGBB ○ 'dimens.xml' 定义尺寸 ○ 'strings.xml' 定义字符串 ○ 'styles.xml' 定义风格对象 � 未加工文件:mp3/video "/res/raw/ " Download at Pin5i.Com andbook - Android 编程 由anddev.org 提供 29292929 在代码中使用资源 在代码中使用资源只是一个知道完整资源 ID 和你资源已被编译成什么类型的问 题。这里是相关资源的语法: R.resource_type.resource_name 或 android.R.resource_type.resource_name resource_type是R的子类,该子类拥有指定类型的资源。resources_name 是在XML 文件中定义的资源的名称属性,或者是被定义成其他文件格式资源的文件名(除 扩展名)。每种类型的资源将会被加载到一个特殊的 R子类中,依赖于该资源的 类型。 被你自己的应用程序编译的资源可以不用包套件名(如 R.resource_type.resource_name 一样简单)就可以引用。Android 包含了一些标准 资源,例如:屏幕风格和按钮背景。为了把这些资源引用到代码中,你必须用 android 来表述它们,例如:android.R.drawable.button_background。 andbook - Android 编程 由 anddev.org 提供 30303030 资源引用 在一个属性中(或资源中)提供的值也可以是一个其他资源的引用。这经常用在 layout 文件中来提供字符串(因此它们可以局部化)和图片(在其他文件中存在的), 而一个引用可以是任何包含颜色和整数的资源类型。 例如,如果我们有颜色资源,我们可以编写一个设置文本颜色大小的 layout 文件 , 颜色、大小是包含于这些资源中的值: 注意这里'@'字首的使用来引入一个资源引用--紧跟的文本是一个处于 @[package:]type/name 结构中的资源名称。由于这样,我们不需要指定套件名, 因为我们在我们自己套件包中引用一个资源。要引用一个系统资源,你应该需要 编写: 像其他示例一样,当在一个 layout 文件中提供字符串你应该总是使用资源引用, 以便它们能够被局部化: Download at Pin5i.Com andbook - Android 编程 由anddev.org 提供 31313131 可选资源&&&&局部化 可选资源和局部化是一个非常有用的结果,你将会喜爱 Android 这样。期待你会 同时设计出一个像风景的 GUI 和好的肖像屏幕定位--那是几乎不可能的。 你可以根据 UI语言或是设备的硬件配置为你应用程序提供不同资源。记住即使 你可以包括不同的字符串、布局和所有其他资源,SDK 没有显露出方法来让你 指定设置哪一个可选资源被使用。Android 为硬件、地域察觉适合的设置,并合 适的家在它们。只有用户可以使用设备上的设置面板选择可选语言设置。 为了包含可选资源,使用破折号-分隔的修饰语添加到文件夹名称中,创建平行 资源文件夹,指出它实用的配置(语言、屏幕方位、dpi、解析、……) 例如,这有一个工程区分 English 和German 值资源(这里只是字符串): Android 支持许多修饰类型,每一个带有不同的值。把这些修饰类型加到资源文 件夹名的后面,被破折号分割开。你可以添加多个修饰类型到每个文件夹名中, 但是他们必须是像它们在这被列出的规则一样出现。例如,为一个完全特定的配 置而包含 drawable 资源的一个文件夹应该像这样: 更典型地,你将是指定一少许一个资源被定义的特定配置选项。你可以从完成的 列表中丢弃任何一个值,只要留下的值任然处于相同的规则。 Android 将会在运行期间选择一个在资源文件下面的哪一个值最合适,这依赖于 当前设备配置。 MyApp/ res/ values-en/ Strings.xml values-de/ strings.xml MyApp/ res/ drawable-en-rUS-port-92dpi-finger-keyshidden-12key-dpad-480x320/ MyApp/ res/ drawable-en-rUS-finger/ drawable-port/ drawable-port-160dpi/ drawable-qwerty/ andbook - Android 编程 由 anddev.org 提供 32323232 魔幻的 R.javaR.javaR.javaR.java 一个工程的 R.java 是一个自动生成文件,它索引了所有你项目的资源。你在你的 源代码中作为一种快捷方式使用这个类来索引你已经包括在你项目中的资源。这 是显著强劲的带有代码自动完成的 IDE 特色,这种 IDE 如:Eclipse,因为他让 你快速地和交互地找出你在寻找的指定引用。 此外,你要使用的资源确实存在,你就获得了编译时安全。 Download at Pin5i.Com andbook - Android 编程 由anddev.org 提供 33333333 HelloWorldHelloWorldHelloWorldHelloWorld --Android --Android --Android --Android 方式 在这本第一手教程中你将学习如何使用一个 XML 布局来创建一个 Android 应用 程序。记住,使用 XML-Layouts 是非常好的。 最终的现实结果像这样: 图6 第一个 Android 应用程序--最终显示(SDK-version :m5) 在所有之前,你需要下载和安装 Android SDK…… andbook - Android 编程 由 anddev.org 提供 34343434 安装 Android SDK 最新 Android SDK--Windows 、Mac 和 Linux 版本总可以从以下 URI 获得: http://code.google.com/android/download.html 它只需要加载并解压到你合适的地方。 AndroidAndroidAndroidAndroid 开发工具(ADT)(ADT)(ADT)(ADT) Android 提供了一个叫"ADT"的 Eclipse 插件来让开发和调试更简单。 ADT 提供了 LogCat 简单访问,Android-Manifest(应用程序配置)/Resource- Editor(资源编辑)/File(文件)/Thread(线程)和 Heap Control(堆栈控制)、打进来的电 话/短信 仿真,等等。--从 SDK version m5 ,所有的多种模拟器都同时得到证实 。 Download at Pin5i.Com andbook - Android 编程 由anddev.org 提供 35353535 安装EclipseEclipseEclipseEclipse 插件(ADT)(ADT)(ADT)(ADT) 要下载和安装 ADT 插件,跟着 Google 提供给开发者的步骤: 1. 启动 Eclipse,接着选择"Help">"Software Updates">"Find and Install" 2. 在出现的对话框中,选择"Search for new features to install"点击"New" 3. 点击"New Remote Site" 4. 在结果对话框中,为远程站点键入一个名称(如:Android Plugin)并键入 这个 URL 作为它的 URL: https://dl-ssl.google.com/android/eclipse/ 点击 OK。 5. 现在你应该看到新站点加载到搜索列表中(并选中),点击 "Finish"。 6. 在后来搜索结果对话框中,选择"Android Plugin">"Developer Tools"复选 框。这将会选择"Android Developer Tools"和"Android Editors"特性。 Android Editors 特性是可选的,但是推荐。如果你选择安装它,你需要在 本文早先提及到的 WST 插件。 现在点击"Newt" 7. 阅读许可协议,选择"Accept terms of th license agreement",点击"Next" 8. 点击"Finish" 9. ADT 插件没有被签名;总之,你可以点击"Install All"接受安装 10. 重启 Eclipse 11. 在重启后,跟新你的 Eclipse 配置来指向 SDK 目录: a.选择"Window">"Preferences" 来打开配置面板。(Mac OS X:"Eclipse">"Preferences") b.从左边面板中选择"Android" c.对于主面板中"SDK Location",点击"Browse"并选中 SDK 目录位置 d.点击"Apply",接着点"OK" 更新ADT ADT ADT ADT 插件 更新 ADT 插件遵循更新一个普通 Eclipse 插件的标准步骤: 1.选择"Help">"Software Updates">"Find and install" 2.选择"Search for updates of the currently installed features"并点击"Finish" 3.如果任何 ADT 跟新可用,选中并安装。 andbook - Android 编程 由 anddev.org 提供 36363636 安装完毕,我们来写点代码 在我们能够开始编写代码前,我们明显地不得不创建一个新的 Android 项目。 创建一个新的 AndroidAndroidAndroidAndroid 项目 1. 需要为每一个 Android 应用程序做的第一件事是创建一个新的 Android 项目。要这样,简单地打开 Eclipse 中的 Package 浏览器,在一些空白处右键 并选择: New >Project…… 图 7 第一个 Android 应用程序-步骤 1 2. 选择: Android > Android Project 图 8 第一个 Android 应用程序-步骤 2 Download at Pin5i.Com andbook - Android 编程 由anddev.org 提供 37373737 3. 用适合你应用程序意图的值来填写表单 图9 第一个 Android 应用程序-步骤 3 4. 这是你第一个 Android- 应用程序的所有文件(别惊慌,它们中大多数是资 源文件) 图 10 第一个 Android 应用程序-步骤 4 andbook - Android 编程 由 anddev.org 提供 38383838 哈哈,所有那些文件可以干什么? 当你现在已经创建类你第一个Android 项目,你将看到一串文件出现在新项目中 。 MainMainMainMain ActivityActivityActivityActivity 当你导航到: "/src/your_package_Structure/Hello_Android.java" 你将看到一些像下面的默认代码: 我们可以立即 我们的应用程序但是让我也阐释一下其他文件。 XML-Layout(main.xml)XML-Layout(main.xml)XML-Layout(main.xml)XML-Layout(main.xml) ADT 为你创建了这个非常基本的 Activity。正如我们知道的,Activity 在某方面 就像 Swing 中的 JFrame。在Android 中,我们继承自 Activity 并需要重写一个单 独的方法,叫做"onCreate()"。在此方法中,我们不得不调用,换句话说, setContentView(R.layout.main)。这让我们的 Activity 使用也被 ADT 创建的 main.xml 文件。 我们有一个"全屏"垂直的线性布局 LinearLayout,它包含一个显示预设字符串的 单个 TextView p a c k a g ep a c k a g ep a c k a g ep a c k a g eorg.anddev.android.Hello_Android; i m p o r tim p o r ti m p o r ti m p o r tandroid.app.Activity; i m p o r tim p o r ti m p o r ti m p o r tandroid.os.Bundle; p u b l i cpu b l i cp u b l i cp u b l i cc l a s scl a s sc l a s sc l a s sHello_Androide x t e n d sex t e n d se x t e n d se x t e n d sA c t i v i t y{ /**C a l l e dw h e nt h ea c t i v i t yi sf i r s tc r e a t e d .*/ @ O v e r r i d e p u b l i cpu b l i cp u b l i cp u b l i cv o i dvo i dv o i dv o i donCreate(BundlesavedInstanceState){ s u p e rsu p e rs u p e rs u p e r.onCreate(savedInstanceState); setContentView(R.layout.m a i n); } } < ?x m lv e r s i o n=" 1 . 0 "e n c o d i n g=" u t f - 8 "? > < /LinearLayout> Download at Pin5i.Com andbook - Android 编程 由anddev.org 提供 39393939 AndroidManifest.xmlAndroidManifest.xmlAndroidManifest.xmlAndroidManifest.xml 我们看看 AndroidManifest.xml: 我们拆分开它 每一个 xml 文件以下面一行开始,它定义了 xml-version 和xml-文本编码类型。 只是把它复制粘贴到每一个新文件中。 如我们所知,每一个 xml 文件中最外层的标签应该包含这个属性: 因为它让各种类的普通 Android 属性在该文件中可用。 标签是包含所有包含在套件中的应用程序级别的组件声明的根元 素。该元素也可以包括应用程序的全局和、或者默认属性,例如一个 label 标签, icon、theme 主题、需求许可,等等。 xmlns:android="http://schemas.android.com/apk/res/android" andbook - Android 编程 由 anddev.org 提供 40404040 这里我们将只是定义 icon,通过"@-引用"到一个放在"/res/drasable"下的图片。 在标签中,我们需要定义所有需要通过 Intent 来启动的 Activity/IntentReceiver。在本例中我们只有一个简单的 Activity。 你大概已经认识到来自标签的 Packag-属性和来自标签的 android:name 属性一起总是产生到 Activity 被描述的完成的包路径中。 最内层的标签是标签,它定义了哪个 Intent 我们想要监听。这里我 们想要 Hello_Android Activity 可以在模拟器中通过点击图标(在标 签中定义了的)来运行。 注意:Android 应用程序调试过程像一个普通 Java 应用程序一样严密。 ..... < /a c t i v i t y> < /intent-filter> Download at Pin5i.Com andbook - Android 编程 由anddev.org 提供 41414141 运行你第一个应用程序 现在我们需要创建一个"-配置"。在 Eclipse 上菜单中打开" 下拉列表"并 选择"Open Run Dialog" 图 11 打开 运行-对话框 图 12 创建 运行配置 andbook - Android 编程 由 anddev.org 提供 42424242 从现在开始,你可以通过点击 来运行你的应用程序。完成后你将看到这个: 图 13 第一个 Android 应用程序-结果(SDK version m5) 在第一次部署后,你也可以看到你的应用程序被列入快速-菜单中,用默认图标 来显示。 图 14 第一个 Android 应用程序-添加到快速菜单(SDK version m5) Download at Pin5i.Com andbook - Android 编程 由anddev.org 提供 43434343 UI--Java UI--Java UI--Java UI--Java 方式 我们用 XML 代码做的同样的事可以通过编写一些 Java 代码行来实现。 记住我们在 xml 例子中如何把我们的 mian.xml 设置成为 ContentView。我们通过 进行以下步骤来完成: Activity.setContentview()也接受一个 View 作为参数。我们将使用该方法来设置一 个简单的 TextView 作为我们的 ContentView。 /*Makethisapplicationuse **themain.xml-layout-file.*/ thisthisthisthis.setContentView(R.layout.main); packagepackagepackagepackageorg.anddev.android.Hello_Android; importimportimportimportandroid.app.Activity; importimportimportimportandroid.os.Bundle; importimportimportimportandroid.widget.TextView; publicpublicpublicpublicclassclassclassclassHello_AndroidextendsextendsextendsextendsActivity{ /**Calledwhentheactivityisfirstcreated.*/ @OverridepublicpublicpublicpublicvoidvoidvoidvoidonCreate(Bundleicicle){ supersupersupersuper.onCreate(icicle); /*Wewanttoviewsomeverysimpletext, *soweneedaTextViewassociatedwiththisActivity.*/ TextViewtv=newnewnewnewTextView(thisthisthisthis); /*PutsometexttothenewlycreatedTextView*/ tv.setText("HelloAndroid-by:anddev.org\n" +"Thisissoooosimple=D"); /*TellourActivitytodisplaythatTextView*/ thisthisthisthis.setContentView(tv); } } andbook - Android 编程 由 anddev.org 提供 44444444 System.out.println(System.out.println(System.out.println(System.out.println(……………………)?)?)?)? 在 Android 中调试不能用 System.out.println(……)来做,因为如我们所知:Android 不是运行在一个普通虚拟机上,而是在 DalvikVM 上的模拟硬件中运行。(老实 说,这可以进行,但是明确地不是你的选择) 但是别担心,Android 提供了许多强劲的调试特性--LogCat LogCatLogCatLogCatLogCat LogCat 是 DDMS(Dalvik 调试监视器服务)的一部分。它提供了一个收集和查看 系统调试输出的机制。来自不同应用程序的 Log 和系统部分被收集到可以查看 和过滤的 LogCat 中。 如果你看不到 A,那就进行 B 方式 图 15 打开 DDMS 视图 Download at Pin5i.Com andbook - Android 编程 由anddev.org 提供 45454545 使用LogCatLogCatLogCatLogCat 每一个 Android Log 信息有一个 tag 标签和一个跟它联系的优先级。 Log 信息的 tag 是一个指示了信息从那个系统组件发出来(例如视图系统的"View" )的短字符串。 Priority 是以下字符值的一个,从最低到最高的优先级: � V---详细信息(最低优先级) � D---调试 � I---信息 � W---警告 � E---错误(最高优先级) 当我们正使用 Eclipse 时,我们能通过点击 LogCat 视图中的"V-D-I-W-E"按钮 (你可以在下面看到)以优先级来简单的过滤。由于那个特性,你将会喜爱上 ADT 插件,因为在全部系统生成的输入中,要找到没有被过滤的任何信息都是十分困 难的。 图 16 LogCat 在代码中用法十分简单。你需要做一个单独的导入: 接着你就可以使用调试陈述,像这样: 当一些危险性事件发生时,你就可以通过 Throwable/Exception 到Log.e(……), 得到打印的错误 StackTrace 输入到 LogCat 中。 importimportimportimportandroid.util.Log; Log.d("DEBUGTAG","Mydebug-message."); trytrytrytry{ throwthrowthrowthrownewnewnewnewException(); }catchcatchcatchcatch(Exceptione){ Log.e("DEBUGTAG","Erroroccured",e); } andbook - Android 编程 由 anddev.org 提供 46464646 使用 IntentIntentIntentIntent 如我们所知,需要被做的事件用 Intent 意图目的来表达。Intent 换句话说被用来 开启其他 Activity。 启动((((子))))ActivityActivityActivityActivity 在一个应用程序生命期中一个基本的事情是比 HelloWorld 应用程序更精密的,就是启动其 他 Activity,尤其是子 Activity。让我们假设以下情况: 我们想要一个像输入框这样的。用户可以在该输入框中写一个他想要在 Google 上查询的关 键字。 因此我们将像我们以前已经做过的一样来创建一个 Android 项目。第一件事就是添加一个我 们将叫做"MySecondActivity"的第二个 Activity。 一开始,代码框架像这样: p a c k a g ep a c k a g ep a c k a g ep a c k a g eorg.anddev.andbook.startingsubactivities; i m p o r ti m p o r ti m p o r ti m p o r tandroid.app.Activity; i m p o r ti m p o r ti m p o r ti m p o r tandroid.os.Bundle; p u b l i cp u b l i cp u b l i cp u b l i cc l a s sc l a s sc l a s sc l a s sMySecondActivitye x t e n d sex t e n d se x t e n d se x t e n d sA c t i v i t y{ /**C a l l e dw h e nt h ea c t i v i t yi sf i r s tc r e a t e d .*/ @O v e r r i d e p u b l i cp u b l i cp u b l i cp u b l i cv o i dv o i dv o i dv o i donCreate(Bundlei c i c l e ){ s u p e rs u p e rs u p e rs u p e r.onCreate(icicle); setContentView(R.layout.main); } } Download at Pin5i.Com andbook - Android 编程 由anddev.org 提供 47474747 我们现在将添加一个 Button 到第一个 Activity 中。我们修改 main.xml 来完成,当然,不通 过选择 Java UI 来完成。 浏览"/res/layout/main.xml"并且你将看到和下面相似的代码: 注意:也许 Eclipse 用它自己的 xml-编辑器(对我们没有任何用处的编辑器)打开这个 main.xml。从 SDK-version m5开始, ADT 插件提供了一个带有高亮洁语法的 Resource- Editor。 图 17 打开 Resource-Editor 如果我们现在启动该应用程序,它像这样的: andbook - Android 编程 由 anddev.org 提供 48484848 图 18 默认布局(SDK-version m5) 当我们想要在我们应用程序中有一个 Button 时,我们将不得不加一些 xml 代码: 如你可以想象的,"fill_parent"让一个 View 使用所有父 View 提供的空间,"wrap_content"只 是使用它需要正确地显示自己内容的布局空间。 因此我们的 button 将宽度填充满整个屏幕,包装我们键入的 android:text 属性"Open Search- Dialog"。 我们的应用程序现在像这样: 图 19 带有按钮的布局(SDK-version m5) 当我们现在点击该按钮--当然,没有事件发生。我们不得不申请一个监听器,是特殊的一个 OnClickListener,来处理在这个按钮上的点击事件。 但是等等……我们怎样在 Java 代码中引用到那个按钮? Download at Pin5i.Com andbook - Android 编程 由anddev.org 提供 49494949 在JavaJavaJavaJava 代码中找到 XMLXMLXMLXML 定义的 ViewViewViewView 为了找到一个在 XML 被定义的 View,我们第一不得不添加那个 View 的一单行 定义到 XML 定义中,一个android:id 属性。在此例我们将给它"btn_open_search" 这个 id: 在Java 代码中找到那个 View 同样简单。在一个 Activity 中你可以使用 "findViewByID(int resourceID)"方法,使用已经在 XML 中定义的 android:id 来得 到一个 View 的引用。 同样其他继承于 View 的类也可以这样做,换句话说,就是 EditText、TextView、 MapView 等等…… 但是"findViewByID(int resourceID)"只能被用在 View 上面。这些 View 是放进布局中的。而这个 Layout 布局被 Activity 使用 setContentView() 来加载的。 回到我们例子中,我们添加了以下代码到 onCreate(),在setContentView()的右边 : 如果 Eclipse 不能找到 Button 类,只是敲击"Ctrl+Shift+O"即可,它将会组织导入 和自动添加(本例中):
还剩60页未读

继续阅读

pdf贡献者

wacky56

贡献于2014-04-09

下载需要 5 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!