27.02.2014 Views

Android 开发教程

Android 开发教程

Android 开发教程

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

-----------------------------------<strong>Android</strong> 编 程 基 础<br />

封 面<br />

1


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

开 放 手 机 联 盟 --Open Handset Alliance<br />

什 么 是 开 放 手 机 联 盟 ?<br />

开 放 手 机 联 盟 ,Open Handset Alliance: 是 美 国 Google 公 司 与 2007 年 11 月 5 日 宣 布 组 建 的 一 个 全 球 性 的 联<br />

盟 组 织 。 这 一 联 盟 将 会 支 持 Google 发 布 的 <strong>Android</strong> 手 机 操 作 系 统 或 者 应 用 软 件 , 共 同 开 发 名 为 <strong>Android</strong> 的 开<br />

放 源 代 码 的 移 动 系 统 。 开 放 手 机 联 盟 包 括 手 机 制 造 商 、 手 机 芯 片 厂 商 和 移 动 运 营 商 几 类 。 目 前 , 联 盟 成 员 数<br />

量 已 经 达 到 了 43 家 。<br />

移 动 手 机 联 盟 创 始 成 员 :<br />

Aplix、Ascender、Audience、Broadcom、 中 国 移 动 、eBay、Esmertec、 谷 歌 、 宏 达 电 、 英 特 尔 、KDDI、<br />

Living Image、LG、Marvell、 摩 托 罗 拉 、NMS、NTT DoCoMo、Nuance、Nvidia、PacketVideo、 高 通 、 三 星 、<br />

SiRF、SkyPop、Sonic Network、Sprint Nextel、Synaptics、TAT、 意 大 利 电 信 、 西 班 牙 电 信 、 德 州 仪 器 、T-Mobile<br />

和 Wind River。<br />

Mobile Operators 移 动 运 营 商 类<br />

China Mobile Communications Corporation 中 国 移 动 通 信<br />

KDDI CORPORATION 日 本 KDDI 电 信<br />

NTT DoCoMo, Inc. 日 本 多 科 莫 电 信<br />

SOFTBANK MOBILE Corp. 日 本 软 银 移 动<br />

Sprint Nextel( 美 国 )<br />

T-Mobile( 德 国 )<br />

Telecom Italia( 意 大 利 )<br />

Telefónica( 西 班 牙 )<br />

Vodafone 沃 达 丰 电 信<br />

China Unicom 中 国 联 通<br />

Semiconductor Companies 半 导 体 制 造 公 司<br />

AKM Semiconductor Inc<br />

Audience<br />

ARM<br />

Atheros Communications<br />

Broadcom Corporation( 博 通 )<br />

Ericsson ( 爱 立 信 公 司 )<br />

Intel Corporation ( 英 特 尔 公 司 )<br />

Marvell Semiconductor, Inc. ( 收 购 了 intel 手 机 芯 片 部 门 的 公 司 )<br />

2


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

NVIDIA Corporation ( 英 伟 达 公 司 )<br />

Qualcomm Inc.( 高 通 公 司 )<br />

SiRF Technology Holdings, Inc.( 知 名 GPS 芯 片 制 造 商 )<br />

Synaptics, Inc.<br />

Texas Instruments Incorporated ( 德 州 仪 器 )<br />

Handset Manufacturers 电 话 制 造 商<br />

ASUSTeK Computer Inc. 华 硕<br />

Garmin International, Inc.<br />

HTC Corporation ( 多 普 达 的 母 公 司 ) 宏 达 电 子<br />

Huawei Technologies 华 为 科 技<br />

LG Electronics, Inc. 乐 金 电 子<br />

Motorola, Inc. 摩 托 罗 拉<br />

Samsung Electronics 三 星 电 子<br />

Sony Ericsson 索 尼 爱 立 信<br />

Toshiba Corporation 东 芝 公 司<br />

lenovo 联 想 移 动<br />

联 盟 成 员 :Software<br />

Companies 软 件 提 供 公 司<br />

Ascender Corp.<br />

eBay Inc.<br />

Esmertec<br />

Google Inc.<br />

LivingImage LTD.<br />

Nuance Communications, Inc.<br />

OMRON SOFTWARE Co, Ltd. 日 本 欧 姆 龙 软 件<br />

有 限 公 司<br />

PacketVideo (PV)<br />

SkyPop<br />

SONiVOX<br />

ASUSTeK Computer Inc. 华 硕<br />

AKM Semiconductor AKM 半 导 体 公 司<br />

ARM 公 司<br />

Borqs 播 思 通 讯<br />

Atheros Communications<br />

Toshiba Corporation 东 芝 公 司<br />

lenovo 联 想 移 动<br />

软 银 移 动 日 本 无 线 运 营 商 软 银<br />

瑞 典 计 算 机 咨 询 公 司 Teleca AB<br />

Garmin International, Inc. 高 明<br />

HTC Corporation ( 多 普 达 的 母 公 司 ) 宏 达 电 子<br />

Huawei Technologies 华 为 科 技<br />

LG Electronics, Inc. 乐 金 电 子<br />

Motorola, Inc. 摩 托 罗 拉<br />

Samsung Electronics 三 星 电 子<br />

Sony Ericsson 索 尼 爱 立 信<br />

沃 达 丰<br />

Teleca<br />

联 盟 目 的<br />

将 会 支 持 Google 可 能 发 布 的 手 机 操 作 系 统 或 者 应 用 软 件 , 共 同 开 发 名 为 <strong>Android</strong> 的 开 放 源 代 码 的 移 动 系<br />

统 。<br />

谷 歌 早 在 2002 年 就 进 入 了 移 动 领 域 , 可 是 由 于 目 前 的 手 机 操 作 系 统 企 业 和 手 机 企 业 相 对 封 闭 , 提 高 了<br />

行 业 的 进 入 门 槛 , 移 动 互 联 网 的 发 展 远 没 有 拥 有 统 一 标 准 的 传 统 互 联 网 发 展 迅 速 , 此 次 推 出 的 开 源 手 机 操 作<br />

系 统 平 台 就 是 出 于 这 个 目 的 。<br />

也 有 分 析 认 为 , 谷 歌 并 不 想 做 一 个 简 单 的 手 机 终 端 制 造 商 或 者 软 件 平 台 开 发 商 , 而 意 在 一 统 传 统 互 联 网 和 移<br />

动 互 联 网 。<br />

3


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

<strong>Android</strong> 手 机 新 概 念<br />

操 作 系 统 的 选 择 -- 定 制 和 长 尾<br />

<br />

<br />

重 构<br />

MVC 和 Web APP 架 构<br />

<strong>Android</strong> 开 发 背 景<br />

计 算 技 术 、 无 线 接 入 技 术 的 发 展 , 使 嵌 入 式 系 统 逐 渐 有 能 力 对 桌 面 系 统 常 规 业 务 进 行 支 持 。<br />

谷 歌 长 期 以 来 奉 行 的 移 动 发 展 战 略 : 通 过 与 全 球 各 地 的 手 机 制 造 商 和 移 动 运 营 商 结 成 合 作 伙 伴 , 开 发 既<br />

有 用 又 有 吸 引 力 的 移 动 服 务 , 并 推 广 这 些 产 品 。<strong>Android</strong> 进 一 步 推 进 了 " 随 时 随 地 为 每 个 人 提 供 信 息 " 这 一 企 业<br />

目 标 的 实 现 。<br />

Open Handset Alliance 汇 集 了 多 家 业 界 巨 头 。 运 营 商 如 :China Mobile、NTT DoCoMo、Vodafone、T-Mobile<br />

等 ; 设 备 制 造 商 如 ASUS、HTC、Huawei、LG、Motorola、Samsung、Sony Ericsson、Toshiba 等 ; 芯 片 厂 商<br />

如 ARM、Broadcom、Intel、Marvell、NVIDIA、Qualcomm 等 。 软 件 厂 商 如 Ascender 、eBay、Esmertec、LivingImage<br />

等 。<br />

<br />

<strong>Android</strong> 更 像 一 款 桌 面 环 境 为 Java 的 Linux 操 作 系 统 。 有 助 于 Google 实 现 其 " 随 时 随 地 为 每 个 人 提 供 信<br />

息 " 的 企 业 战 略 。<br />

HTC Dream/G1 具 体 配 置<br />

硬 件<br />

3.17 英 寸 HVGA (480 x 320) ;1150mAh 电 池 ; 高 通 528Mhz 7201 处 理 器 ;64MB RAM、128MB ROM ;1GB<br />

MicroSD 卡 ;QWERTY 全 键 盘 ;310 万 像 素 摄 像 头 。<br />

流 媒 体<br />

支 持 视 频 格 式 :H.264、 流 媒 体 、3GPP、MPEG4 和 Codec 3GP ; 支 持 音 频 格 式 :MP3、AAC、AAC+、WMA、<br />

MPEG4、WAV、MIDI、REAL、AUDIO 和 OGG; 支 持 墙 纸 格 式 :JPG、BMP、PNG 和 GIF ; 铃 声 (MP3、<br />

AAC、AAC+ 和 WMA)。<br />

接 入 技 术<br />

蓝 牙 (class 1) ; 四 频 (850,900,1800,1900); 支 持 3G,802.11b 和 802.11g。<br />

4


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

互 联 网<br />

支 持 HTTP、WAP Push 和 xHTML; 支 持 POP、IMAP、SMTP, 以 及 AOL 和 GMAIL 电 子 邮 件 服 务 ; 支 持 AIM、<br />

MSN、 雅 虎 通 和 GTALK; 与 谷 歌 日 历 同 步 ; 与 <strong>Android</strong> Market 联 机 ; 支 持 谷 歌 “ 街 景 ” 服 务 ; 包 装 盒 内 附<br />

数 据 工 具 包 。<br />

更 多 信 息<br />

https://sites.google.com/a/android.com/opensource/release-features<br />

<strong>Android</strong> 盈 利 模 式<br />

<strong>Android</strong> 的 App Market 模 式 , 软 件 开 发 者 获 得 7 成 收 入 ,3 成 用 于 系 统 维 护 。 难 点 在 于 位 置 营 销 。<br />

设 备 商 通 过 卖 设 备 、 内 置 特 色 应 用 来 获 得 盈 利 。 也 可 以 兼 职 专 业 软 件 开 发 者 进 行 赢 利 。<br />

Google 自 身 通 过 基 于 统 一 平 台 为 用 户 提 供 信 息 来 盈 利 。<br />

<strong>Android</strong> 的 优 势<br />

<br />

源 代 码 完 全 开 放 , 便 于 开 发 人 员 更 清 楚 的 把 握 实 现 细 节 , 便 于 提 高 开 发 人 员 的 技 术 水 平 , 有 利 于 开 发 出<br />

更 具 差 异 性 的 应 用 。<br />

采 用 了 对 有 限 内 存 、 电 池 和 CPU 优 化 过 的 虚 拟 机 Dalvik,<strong>Android</strong> 的 运 行 速 度 比 想 象 的 要 快 很 多 。<br />

运 营 商 ( 中 国 移 动 等 ) 的 大 力 支 持 , 产 业 链 条 的 热 捧 。<br />

良 好 的 盈 利 模 式 (3/7 开 ), 产 业 链 条 的 各 方 : 运 营 商 、 制 造 商 、 独 立 软 件 生 产 商 都 可 以 获 得 不 错 的 利 益 。<br />

将 移 动 终 端 的 评 价 标 准 从 硬 件 向 软 件 转 变 , 极 大 的 激 发 了 软 件 开 发 者 的 热 情 。<br />

<strong>Android</strong> 的 源 代 码 遵 循 Apache V2 软 件 许 可 , 而 不 是 通 常 的 GPL v2 许 可 。 有 利 于 商 业 开 发 。<br />

具 有 强 大 的 Linux 社 区 的 支 持 。<br />

<strong>Android</strong> 的 不 足<br />

<br />

由 于 采 用 了 Java 作 为 应 用 开 发 语 言 , 目 前 可 用 的 传 统 第 三 方 应 用 还 很 少 , 但 由 于 <strong>Android</strong> 是 一 款 完 全 开<br />

源 的 移 动 计 算 平 台 , 相 信 第 三 方 应 用 会 很 快 的 丰 富 起 来 。<br />

<br />

Google 提 供 了 一 套 Java 核 心 包 (J2SE 5,J2SE 6) 的 有 限 子 集 , 尚 不 承 诺 遵 守 Java 任 何 Java 规 范 , 可 能 会 造<br />

成 Java 阵 营 的 进 一 步 分 裂 。<br />

现 有 应 用 完 善 度 不 太 够 , 需 要 的 开 发 工 作 量 较 大 。<br />

5


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

基 于 QEMU 开 发 的 模 拟 器 调 试 手 段 不 十 分 丰 富 , 只 支 持 通 话 、SMS 等 , 速 度 慢 。<br />

<br />

暂 不 具 备 Push Mail 和 Office(DataViz、 QuickOffice 计 划 近 期 推 出 ) 功 能 , 目 前 主 要 面 向 的 是 普 通 消 费 者<br />

用 户 , 对 商 业 用 户 支 持 尚 弱 。<br />

<strong>Android</strong> 带 来 的 影 响<br />

ANDROID 的 推 出 后 可 能 影 响 的 产 业 包 括 移 动 电 信 业 , 软 件 开 发 业 , 手 机 制 造 业 , 在 以 消 费 者 为 核 心 的 状 态 。<br />

对 消 费 者 的 影 响<br />

高 档 手 机 选 择 面 增 加 。<br />

<br />

<strong>Android</strong> 在 设 计 初 期 就 考 虑 了 与 现 其 有 业 务 的 融 合 , 改 变 以 往 从 计 算 机 为 主 改 成 从 手 机 使 用 为 导 向 。 新<br />

生 应 用 如 :Google 地 图 及 其 衍 生 应 用 、GMail、GTalk 等 。<br />

GPS 卫 星 导 航 功 能 , 手 机 照 相 ,MP3, 蓝 芽 等 均 被 列 为 <strong>Android</strong> 所 提 供 支 持 的 基 本 选 项 。<br />

<br />

<strong>Android</strong> 的 平 台 基 本 上 是 免 费 的 , 虽 然 有 部 份 原 生 链 接 库 会 要 求 费 用 , 但 大 部 份 是 免 权 利 金 ;<strong>Android</strong> 的<br />

程 序 可 以 采 用 JAVA 开 发 , 但 是 因 为 它 的 虚 拟 机 (Virtual Machine) Dalvik, 是 将 JAVA 的 bytecode 转 成 自<br />

己 的 格 式 , 回 避 掉 需 要 付 给 SUN 有 关 JAVA 的 授 权 费 用 。<br />

对 手 机 制 造 者 的 影 响<br />

<br />

<strong>Android</strong> 是 款 开 源 的 移 动 计 算 软 件 平 台 , 组 建 了 google 主 导 的 拥 有 众 多 产 业 界 巨 头 的 产 业 联 盟 , 有 利 于<br />

高 效 开 发 、 降 低 成 本 。<br />

<br />

由 于 是 源 代 码 开 放 的 产 品 , 对 非 主 导 厂 商 而 言 , 可 以 避 开 与 主 导 厂 商 在 核 心 技 术 上 面 的 差 距 , 开 发 出 更<br />

具 竞 争 力 和 差 异 化 的 产 品 。<br />

对 运 营 商 的 影 响<br />

丰 富 的 数 据 业 务 , 将 导 致 数 据 流 量 的 显 著 增 加 。<br />

手 机 来 源 增 加 , 价 格 更 为 低 廉 。<br />

对 软 件 开 发 者 的 影 响<br />

因 为 <strong>Android</strong> 移 动 软 件 平 台 抱 持 开 放 互 通 的 观 念 , 势 必 吸 引 不 少 自 由 软 件 的 拥 护 者 。<br />

开 发 方 向 有 三 个 重 点 :<br />

6


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

‣ 应 用 软 件 的 开 发<br />

‣ 特 殊 功 能 的 原 生 链 接 库<br />

‣ 专 属 应 用 程 序 框 架<br />

由 于 <strong>Android</strong> 的 App Market 性 质 , 可 能 催 生 出 专 门 的 应 用 软 件 开 发 商 。<br />

<strong>Android</strong> 应 用 现 状<br />

设 备 商 :lenovo、 琦 基 、 戴 尔 、 三 星 、 摩 托 罗 拉 、 华 为 、 英 特 尔 、Kogan、 索 爱 、 华 硕 、 多 普 达 、 爱 可 视 、<br />

Archos 等 。<br />

制 造 商 :HTC、Telstra 等 。<br />

手 机 设 计 公 司 : 播 思 、 德 信 无 线 等 。<br />

运 营 商 : 中 国 移 动 、Sprint、T-Mobile、Teleca AB 等 。<br />

芯 片 商 :Qualcomm、Marvell、TI、Boardcom 等 。<br />

7


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

<strong>Android</strong> 开 发 入 门<br />

System Requirements<br />

The sections below describe the system and software requirements for developing <strong>Android</strong> applications using the<br />

<strong>Android</strong> SDK tools included in <strong>Android</strong> 1.1 SDK, Release 1.<br />

Supported Operating Systems<br />

• Windows XP (32-bit) or Vista (32- or 64-bit)<br />

• Mac OS X 10.4.8 or later (x86 only)<br />

• Linux (tested on Linux Ubuntu Dapper Drake)<br />

Supported Development Environments<br />

Eclipse IDE<br />

o<br />

o<br />

o<br />

o<br />

Eclipse 3.3 (Europa), 3.4 (Ganymede)<br />

• Eclipse JDT plugin (included in most Eclipse IDE packages)<br />

• WST (optional, but needed for the <strong>Android</strong> Editors feature; included in most Eclipse IDE<br />

packages)<br />

JDK 5 or JDK 6 (JRE alone is not sufficient)<br />

<strong>Android</strong> Development Tools plugin (optional)<br />

Not compatible with Gnu Compiler for Java (gcj)<br />

Other development environments or IDEs<br />

o<br />

o<br />

o<br />

JDK 5 or JDK 6 (JRE alone is not sufficient)<br />

Apache Ant 1.6.5 or later for Linux and Mac, 1.7 or later for Windows<br />

Not compatible with Gnu Compiler for Java (gcj)<br />

Note: If JDK is already installed on your development computer, please take a moment to make sure that it meets the<br />

version requirements listed above. In particular, note that some Linux distributions may include JDK 1.4 or Gnu<br />

Compiler for Java, both of which are not supported for <strong>Android</strong> development<br />

8


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

什 么 是 <strong>Android</strong>?<br />

<strong>Android</strong> 是 一 个 专 门 针 对 移 动 设 备 的 软 件 集 , 它 包 括 一 个 操 作 系 统 , 中 间 件 和 一 些 重 要 的 应 用 程 序 。Beta 版<br />

的 <strong>Android</strong> SDK 提 供 了 在 <strong>Android</strong> 平 台 上 使 用 JaVa 语 言 进 行 <strong>Android</strong> 应 用 开 发 必 须 的 工 具 和 API 接 口 。<br />

特 性<br />

• 应 用 程 序 框 架 支 持 组 件 的 重 用 与 替 换<br />

• Dalvik 虚 拟 机 专 为 移 动 设 备 优 化<br />

• 集 成 的 浏 览 器 基 于 开 源 的 WebKit 引 擎<br />

• 优 化 的 图 形 库 包 括 定 制 的 2D 图 形 库 ,3D 图 形 库 基 于 OpenGL ES 1.0 ( 硬 件 加 速 可 选 )<br />

• SQLite 用 作 结 构 化 的 数 据 存 储<br />

• 多 媒 体 支 持 包 括 常 见 的 音 频 、 视 频 和 静 态 图 像 格 式 ( 如 MPEG4, H.264, MP3, AAC, AMR, JPG, PNG,<br />

GIF)<br />

• GSM 电 话 技 术 ( 依 赖 于 硬 件 )<br />

• 蓝 牙 Bluetooth, EDGE, 3G, 和 WiFi( 依 赖 于 硬 件 )<br />

• 照 相 机 ,GPS<br />

GPS, 指 南 针 , 和 加 速 度 计 (accelerometer<br />

accelerometer) ( 依 赖 于 硬 件 )<br />

• 丰 富 的 开 发 环 境 包 括 设 备 模 拟 器 , 调 试 工 具 , 内 存 及 性 能 分 析 图 表 , 和 Eclipse 集 成 开 发 环 境 插 件<br />

应 用 程 序<br />

<strong>Android</strong> 会 同 一 系 列 核 心 应 用 程 序 包 一 起 发 布 , 该 应 用 程 序 包 包 括 email 客 户 端 ,SMS 短 消 息 程 序 , 日 历 ,<br />

地 图 , 浏 览 器 , 联 系 人 管 理 程 序 等 。 所 有 的 应 用 程 序 都 是 使 用 JAVA 语 言 编 写 的 。<br />

应 用 程 序 框 架<br />

开 发 人 员 也 可 以 完 全 访 问 核 心 应 用 程 序 所 使 用 的 API 框 架 。 该 应 用 程 序 的 架 构 设 计 简 化 了 组 件 的 重 用 ; 任 何<br />

一 个 应 用 程 序 都 可 以 发 布 它 的 功 能 块 并 且 任 何 其 它 的 应 用 程 序 都 可 以 使 用 其 所 发 布 的 功 能 块 ( 不 过 得 遵 循 框<br />

架 的 安 全 性 限 制 )。 同 样 , 该 应 用 程 序 重 用 机 制 也 使 用 户 可 以 方 便 的 替 换 程 序 组 件 。<br />

隐 藏 在 每 个 应 用 后 面 的 是 一 系 列 的 服 务 和 系 统 , 其 中 包 括 ;<br />

• 丰 富 而 又 可 扩 展 的 视 图 (Views), 可 以 用 来 构 建 应 用 程 序 , 它 包 括 列 表 (lists), 网 格 (grids), 文<br />

本 框 (text boxes), 按 钮 ( buttons), 甚 至 可 嵌 入 的 web 浏 览 器 。<br />

• 内 容 提 供 器 (Content Providers) 使 得 应 用 程 序 可 以 访 问 另 一 个 应 用 程 序 的 数 据 ( 如 联 系 人 数 据 库 ), 或<br />

者 共 享 它 们 自 己 的 数 据<br />

• 资 源 管 理 器 (Resource Manager) 提 供 非 代 码 资 源 的 访 问 , 如 本 地 字 符 串 , 图 形 , 和 布 局 文 件 ( layout<br />

files )。<br />

• 通 知 管 理 器 (Notification Manager) 使 得 应 用 程 序 可 以 在 状 态 栏 中 显 示 自 定 义 的 提 示 信 息 。<br />

• 活 动 管 理 器 ( Activity Manager) 用 来 管 理 应 用 程 序 生 命 周 期 并 提 供 常 用 的 导 航 回 退 功 能 。<br />

9


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

程 序 库<br />

<strong>Android</strong> 包 含 一 些 C/C++ 库 , 这 些 库 能 被 <strong>Android</strong> 系 统 中 不 同 的 组 件 使 用 。 它 们 通 过 <strong>Android</strong> 应 用 程 序 框 架<br />

为 开 发 者 提 供 服 务 。 以 下 是 一 些 核 心 库 :<br />

• 系 统 C 库 - 一 个 从 BSD 继 承 来 的 标 准 C 系 统 函 数 库 ( libc ), 它 是 专 门 为 基 于 embedded linux<br />

的 设 备 定 制 的 。<br />

• 媒 体 库 - 基 于 PacketVideo OpenCORE; 该 库 支 持 多 种 常 用 的 音 频 、 视 频 格 式 回 放 和 录 制 , 同 时 支 持<br />

静 态 图 像 文 件 。 编 码 格 式 包 括 MPEG4, H.264, MP3, AAC, AMR, JPG, PNG 。<br />

• Surface Manager - 对 显 示 子 系 统 的 管 理 , 并 且 为 多 个 应 用 程 序 提 供 了 2D 和 3D 图 层 的 无 缝 融 合 。<br />

• LibWebCore - 一 个 最 新 的 web 浏 览 器 引 擎 用 , 支 持 <strong>Android</strong> 浏 览 器 和 一 个 可 嵌 入 的 web 视 图 。<br />

• SGL - 底 层 的 2D 图 形 引 擎<br />

• 3D libraries - 基 于 OpenGL ES 1.0 APIs 实 现 ; 该 库 可 以 使 用 硬 件 3D 加 速 ( 如 果 可 用 ) 或 者 使 用 高<br />

度 优 化 的 3D 软 加 速 。<br />

• FreeType - 位 图 (bitmap) 和 矢 量 (vector) 字 体 显 示 。<br />

• SQLite - 一 个 对 于 所 有 应 用 程 序 可 用 , 功 能 强 劲 的 轻 型 关 系 型 数 据 库 引 擎 。<br />

<strong>Android</strong> 运 行 库<br />

<strong>Android</strong> 包 括 了 一 个 核 心 库 , 该 核 心 库 提 供 了 JAVA 编 程 语 言 核 心 库 的 大 多 数 功 能 。<br />

每 一 个 <strong>Android</strong> 应 用 程 序 都 在 它 自 己 的 进 程 中 运 行 , 都 拥 有 一 个 独 立 的 Dalvik 虚 拟 机 实 例 。Dalvik 被 设 计<br />

成 一 个 设 备 可 以 同 时 高 效 地 运 行 多 个 虚 拟 系 统 。 Dalvik 虚 拟 机 执 行 (.dex) 的 Dalvik 可 执 行 文 件 , 该 格 式 文<br />

件 针 对 小 内 存 使 用 做 了 优 化 。 同 时 虚 拟 机 是 基 于 寄 存 器 的 , 所 有 的 类 都 经 由 JAVA 编 译 器 编 译 , 然 后 通 过 SDK<br />

中 的 "dx" 工 具 转 化 成 .dex 格 式 由 虚 拟 机 执 行 。<br />

Dalvik 虚 拟 机 依 赖 于 linux 内 核 的 一 些 功 能 , 比 如 线 程 机 制 和 底 层 内 存 管 理 机 制 。<br />

Linux 内 核<br />

<strong>Android</strong> 的 核 心 系 统 服 务 依 赖 于 Linux 2.6 内 核 , 如 安 全 性 , 内 存 管 理 , 进 程 管 理 , 网 络 协 议 栈 和 驱 动 模 型 。<br />

Linux 内 核 也 同 时 作 为 硬 件 和 软 件 栈 之 间 的 抽 象 层 。<br />

10


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

<strong>Android</strong> 的 系 统 架 构<br />

系 统 构 架<br />

<strong>Android</strong> 内 核<br />

Linux 内 核 版 本 2.6<br />

位 于 硬 件 和 软 件 堆 之 间 的 抽 象 层<br />

核 心 服 务 : 安 全 机 制 、 内 存 管 理 、 进 程 管 理 、 网 络 、 硬 件 驱 动 。<br />

<strong>Android</strong> 依 赖 Linux 内 核 2.6 提 供 核 心 服 务 , 比 如 安 全 、 内 存 管 理 、 进 程 管 理 、 网 络 、 硬 件 驱 动 。 在 这 里 ,Linux<br />

内 核 扮 演 的 是 硬 件 层 和 系 统 其 它 层 次 之 间 的 一 个 抽 象 层 的 概 念 。 这 个 操 作 系 统 并 非 类 GNU/Linux 的 , 因 为 其<br />

系 统 库 , 系 统 初 始 化 和 编 程 接 口 都 和 标 准 的 Linux 系 统 是 有 所 不 同 的 。<br />

11


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

从 Google 目 前 release 的 Linux 系 统 来 看 , 其 没 有 虚 拟 内 存 文 件 系 统 , 系 统 所 用 的 是 yaffs2 文 件 系 统 , 具 体<br />

的 映 像 也 都 位 于 SDK 安 装 目 录 下 。 通 过 emulator -console 命 令 , 我 们 可 以 在 host 中 断 下 得 到 一 个 简 单 的 可 以<br />

控 制 <strong>Android</strong> 的 shell , 这 个 系 统 包 含 了 一 个 Toolbox , 提 供 一 些 基 本 的 命 令 工 具 , 集 中 在<br />

/sbin,/system/sbin,/system/bin 中 , 但 是 很 简 陋 , 命 令 种 类 也 很 少 。<br />

目 前 <strong>Android</strong> 的 程 序 安 装 模 式 是 靠 Eclipse 自 动 进 行 的 , 通 过 对 底 层 的 分 析 可 知 , 大 致 步 骤 就 是 在 /data/app 和<br />

data/data 下 存 放 android 底 层 和 普 通 内 核 没 有 什 么 大 的 区 别 , 我 们 可 以 将 其 作 为 一 个 Linux 来 进 行 开 发 和<br />

hacking。<br />

Lib 和 运 行 环 境<br />

lib<br />

C/C++ 库 : 被 各 种 <strong>Android</strong> 组 件 使 用<br />

通 过 应 用 程 序 框 架 开 发 者 可 以 使 用 其 功 能<br />

包 括 :<br />

‣ 媒 体 库 :MPEG4 H.264 MP3 JPG PNG .....<br />

‣ WebKit/LibWebCore:Web 浏 览 引 擎<br />

‣ SQLite 关 系 数 据 库 引 擎<br />

‣ 2D,3D 图 形 库 、 引 擎<br />

丰 富 的 类 库 支 持 :2D 和 3D 图 像 库 OpenGL ES、 数 据 库 SQLite、 对 象 数 据 库 db4o 类 库 、 媒 体 库 、 基 于 Linux<br />

底 层 系 统 C 库 等 等 , 让 应 用 开 发 更 简 单 多 样 。Google 使 用 Apache 的 Harmony 类 库 ,Harmony 某 些 方 面 速 度<br />

快 于 Sun 的 VM。Runtime 在 Dalvik Java VM 上 ,Dalvik 采 用 简 练 、 高 效 的 byte code 格 式 运 行 , 它 能 够 在 低<br />

资 耗 和 没 有 应 用 相 互 干 扰 的 情 况 下 并 行 执 行 多 个 应 用 。<br />

运 行 时 环 境<br />

<br />

<br />

<br />

<br />

<br />

核 心 库 提 供 的 Java 功 能<br />

Dalvik 虚 拟 机 依 赖 于 Linux 内 核 , 例 如 线 程 或 底 层 内 存 管 理<br />

设 备 可 以 运 行 多 个 Dalvik 虚 拟 机 , 每 一 个 <strong>Android</strong> 应 用 程 序 在 它 自 己 的 Dalvik VM 实 例 中 运 行<br />

VM 执 行 优 化 的 Dalvik 可 执 行 文 件 (.dex)<br />

Dx- 工 具 把 编 译 过 的 Java 文 件 转 换 为 dex 文 件<br />

12


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

应 用 和 框 架<br />

核 心 应 用 , 例 如 联 系 人 , 电 子 邮 件 , 电 话 , 浏 览 器 , 日 历 , 地 图 , ...<br />

充 分 访 问 所 有 核 心 应 用 框 架 API<br />

简 化 组 件 的 重 用<br />

用 Java 编 写 应 用 程 序<br />

13


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

支 持 的 功 能<br />

+ Application framework: 可 重 用 的 和 可 替 换 的 组 件 部 分 , 在 这 个 层 面 上 , 所 有 的 软 件 都 是 平 等 的 。<br />

+ Dalvik virtul machine: 一 个 基 于 Linux 的 虚 拟 机 。<br />

+ Integrated browser: 一 个 基 于 开 源 的 WebKit 引 擎 的 浏 览 器 , 在 应 用 程 序 层 。<br />

+ Optimized graphics: 包 含 一 个 自 定 义 的 2D 图 形 库 和 基 于 OpenGL ES 1.0 标 准 的 3D 实 现 。<br />

+ SQLite: 数 据 库<br />

+ Media support: 通 用 的 音 频 , 视 频 和 对 各 种 图 片 格 式 的 支 持 (MPEG4, H.264, MP3, AAC, AMR, JPG, PNG, GIF)<br />

+ GSM Telephony: GSM 移 动 网 络 , 硬 件 支 持 。<br />

+ Bluetooth, EDGE, 3G, and WiFi: 都 依 赖 于 硬 件 支 持 。<br />

+ Camera, GPS, compass, and accelerometer: 都 依 赖 于 硬 件 支 持 。<br />

+ Rich development environment: 包 含 一 套 完 整 的 开 发 工 具 集 , 方 便 跟 踪 调 试 , 内 存 检 测 和 性 能 测 试 , 而 且<br />

提 供 了<br />

Eclipse 的 插 件 。 最 底 层 的 是 一 个 Linux Kernel, 加 载 了 几 个 移 动 设 备 必 要 的 系 统 驱 动 ( 这 么 说 来 <strong>Android</strong> 基<br />

础 系 统 是 要 以 GPL 发 布 了 ? 不 知 道 34 家 厂 商 的 硬 件 开 发 商 们 是 怎 么 样 想 的 ); 上 面 是 类 库 和 Runtime, 绿 色<br />

的 类 库 部 分 可 以 看 到 大 名 鼎 鼎 的 SQLite, 这 个 软 件 甚 至 声 称 自 己 属 于 公 共 领 域 ( 比 MIT License 还 要 强 @@),<br />

字 体 FreeType 是 BSD-style License 的 , 图 形 库 OpenGL ES 只 需 通 过 产 品 测 试 , 无 偿 使 用 于 产 品 。 再 向 上 看<br />

是 应 用 层 的 东 西 了 , 这 里 可 以 做 的 事 情 就 非 常 多 了 , 各 个 社 区 , 各 个 厂 家 都 可 以 参 与 进 来 。 难 怪 <strong>Android</strong> 的 sdk<br />

可 以 Apache License 发 布 了 , 对 企 业 和 开 发 人 员 友 好 啊 。 那 么 Google 自 己 的 东 西 在 哪 里 呢 ? 没 错 , 就 是 右<br />

边 那 个 runtime, 最 吸 引 技 术 人 员 的 就 是 这 个 runtime( 注 意 , 这 个 才 是 <strong>Android</strong> 的 核 心 )。Google 为 它 准 备 了<br />

一 个 虚 拟 机 , 叫 做 Dalvik。 这 个 让 人 摸 不 着 头 脑 的 东 西 的 到 底 是 什 么 ? 从 开 发 平 台 上 我 们 清 清 楚 楚 地 得 到 了<br />

答 案 :Java<br />

14


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

封 面<br />

15


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

封 面<br />

1


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

7 个 Linux 手 机 平 台<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

Maemo<br />

<strong>Android</strong><br />

LIMO<br />

OpenMOKO<br />

GPE^2<br />

ALP<br />

QTopia Phone Edition<br />

Maemo 架 构<br />

2


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

<strong>Android</strong> 架 构<br />

3


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

LIMO 架 构<br />

4


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

OpneMOKO 架 构<br />

5


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

GPE^2 架 构<br />

6


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

ALP 架 构<br />

7


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

QTopia Phone Edition 架 构<br />

8


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

进 程 间 的 通 信<br />

Linux 手 机 平 台 进 程 间 通 信<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

Maemo 采 用 D-BUS<br />

<strong>Android</strong> 采 用 OpenBinder<br />

LiMO 采 用 D-BUS<br />

OpenMoko 采 用 D-BUS<br />

GPE Phone Edition 采 用 D-BUS<br />

ALC 采 用 OpenBinder<br />

Qtopia Phone Edition 采 用 D-BUS<br />

进 程 间 通 信 种 类<br />

<br />

<br />

<br />

<br />

<br />

D-BUS<br />

Openbinder<br />

CORBA/Corbit<br />

IVY<br />

GNET<br />

D-BUS<br />

9


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

<strong>Android</strong> 学 习 方 法<br />

1<br />

2<br />

3<br />

4<br />

了 解 什 么 是 Androi<br />

建 立 开 发 环 境<br />

阅 读 SDK 文 档<br />

背 景 知 识<br />

Java<br />

面 向 对 象<br />

设 计 模 式<br />

J2ME、Brew、Symbian<br />

建 立 <strong>Android</strong> 开 发 环 境<br />

1 下 载 JDK 5 or JDK 6 (JRE alone is not sufficient) -> 安 装 -> 设 置 环 境 变 量<br />

JAVA_HOME CLASSPATH path<br />

2 下 载 Eclipse 3.3 (Europa), 3.4 (Ganymede) IDE for JAVA-> 解 压<br />

3 下 载 <strong>Android</strong> SDK 解 压 -> path 里 加 入 SDK 包 中 的 tools 目 录 全 路 径<br />

4 下 载 ADT 0.8.0 解 压<br />

5 打 开 Eclipse 安 装 ADT 插 件<br />

10


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

封 面<br />

11


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

封 面<br />

1


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

<strong>Android</strong> 开 发 环 境 搭 建<br />

ADV 的 创 建<br />

ADT0.9.1 版 本<br />

1<br />

在 Eclipse 中 创 建<br />

2


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

2<br />

在 命 令 行 中 创 建<br />

打 开 CMD 命 令 行 , 进 入 到 <strong>Android</strong> SDK tools 目 录<br />

cd<br />

E:\Mobile DEV\<strong>Android</strong>_SDK1.5\tools<br />

使 用 android 命 令 列 出 target 值<br />

android list targets<br />

使 用 android create avd 命 令 来 创 建 AVD<br />

行 为 :"create avd":<br />

创 建 一 个 新 的 <strong>Android</strong> 虚 拟 设 备 。<br />

选 项 :<br />

-t --target 新 的 AVD 的 Target ID( 必 须 )<br />

-c --sdcard 指 向 一 个 共 享 的 SD 存 储 卡 的 路 径 或 是 为 新 的 AVD 定 制 的 新 SD 存 储 卡 的 容 量 大 小<br />

-p --path 新 AVD 将 被 创 建 的 位 置 路 径<br />

-n --name 新 AVD 的 名 称 ( 必 须 )<br />

-f --force 强 制 创 建 ( 覆 盖 已 存 在 的 AVD)<br />

-s --skin 新 AVD 的 皮 肤<br />

3


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

例 子 : 将 建 一 个 名 叫 GPhone 的 AVD,Target ID=2、SD 存 储 卡 容 量 52M、 路 径 C:\AVD\、 皮 肤 SUSE-HVGA-P<br />

android create avd -n GPhone -t 2 -c 52M -p C:\AVD\ -s SUSE-HVGA-P<br />

查 看 自 己 新 创 建 的 ADV :list avd 命 令<br />

android list avd<br />

ADT0.9.0 版 本<br />

只 能 在 命 令 行 中 创 建<br />

开 启 命 令 行 进 入 <strong>Android</strong> SDK tools 目 录<br />

cd E:\Mobile DEV\<strong>Android</strong>_SDK1.5\tools<br />

列 出 Target ID<br />

andriod list target<br />

创 建 一 个 新 的 AVD<br />

android create avd -n GPhone -t 2 -c 52M -p C:\AVD\ -s SUSE-HVGA-P<br />

查 看 新 创 建 的 AVD<br />

android list avd<br />

运 行 指 定 的 AVD<br />

运 行 新 创 建 的 AVD:GPhone<br />

emulator -avd GPhone<br />

4


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

Windows 平 台 :<br />

Eclipse IDE 版 本<br />

1. 必 须 软 件<br />

------------JDK+Eclipse+<strong>Android</strong> SDK+ADT<br />

1 JAVA JDK SE 1.6 jdk-6u13-windows-i586-p.exe<br />

2 Eclipse 3.4.2 eclipse-java-ganymede-SR2-win32.zip<br />

3 Google <strong>Android</strong> SDK android-sdk-windows-1.5_r1.zip<br />

4 ADT-0.9.0 ADT-0.9.0.zip<br />

2. 安 装 过 程<br />

1 安 装 JAVA JDK SE 1.6<br />

‣ 设 置 环 境 变 量<br />

JAVA_HOME<br />

JAVA_HOME=C:\Program Files\Java\jdk1.6.0_13<br />

<br />

JAVA_JRE_HOME<br />

JAVA_JRE_HOME=C:\Program Files\Java\jdk1.6.0_13\jre<br />

<br />

JRE_HOME<br />

JRE_HOME=C:\Program Files\Java\jre6<br />

<br />

<strong>Android</strong>_SDK_HOME<br />

<strong>Android</strong>_SDK_HOME=C:\Mobile Phone DEV\<strong>Android</strong> SDK<br />

<br />

CLASSPATH<br />

CLASSPATH=.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.<br />

jar;%JRE_HOME%\lib;%JRE_HOME%\lib\rt.jar;%JAVA_JRE_HOME%\lib;%JAVA_JRE_HOME%<br />

\lib\rt.jar<br />

Path<br />

要 使 用 命 令 行 工 具 必 须 配 置<br />

Path=%<strong>Android</strong>_SDK_HOME%\tools;%JAVA_HOME%\bin;%JRE_HOME%\bin;%JAVA_JRE<br />

_HOME%\bin;<br />

5


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

2 解 压 Eclipse 3.4.2<br />

解 压 eclipse-java-ganymede-SR2-win32.zip<br />

到 C:\Eclipse For <strong>Android</strong>\<br />

3<br />

解 压 Google <strong>Android</strong> SDK<br />

解 压 android-sdk-windows-1.5_r1.zip 到 C:\Mobile Phone DEV\<strong>Android</strong> SDK<br />

4 Eclipse 下 安 装 ADT 0.9.0<br />

复 制 ADT-0.9.0.zip 到 C:\<br />

打 开 C:\Eclipse For <strong>Android</strong>\eclipse.exe<br />

设 置 工 作 路 径 为 C:\WorkSpace<br />

Help->SoftWare Update->find and install ->Search for new features to install ->Next->New Archived<br />

site-> 选 中 C:\ ADT-0.9.0.zip->OK->Finish->ADT-0.9.0.zip 选 勾 ->Next->Accept->Next->Finish-<br />

>Install All->Restart “YES”<br />

5<br />

设 置 Google <strong>Android</strong> SDK 路 径<br />

Window->preferences-> 选 中 <strong>Android</strong>->SDK Location 中 选 择 Google <strong>Android</strong> SDK 的 安 装 路 径<br />

C:\Mobile Phone DEV\<strong>Android</strong> SDK->OK<br />

6


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

3. HelloWorld 程 序 实 例<br />

1<br />

新 建 一 个 <strong>Android</strong> Project<br />

• Project name 设 置 工 程 名 Hello Google <strong>Android</strong><br />

• Package name 设 置 包 名 zyf.android.test.hello<br />

• Activity name 设 置 活 动 名 Hello<br />

• Application name<br />

设 置 应 用 程 序 名 Hello<br />

• Build Target 设 置 AVD API 的 版 本 3 <strong>Android</strong>1.5<br />

7


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

8


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

2 修 改 Hello.java 文 件 内 容 如 下 :<br />

package zyf.android.test.hello;<br />

import android.app.Activity;<br />

import android.os.Bundle;<br />

import android.widget.TextView;<br />

public class Hello extends Activity {<br />

/** Called when the activity is first created. */<br />

@Override<br />

public void onCreate(Bundle savedInstanceState) {<br />

super.onCreate(savedInstanceState);<br />

// setContentView(R.layout.main);<br />

TextView tv = new TextView(this<br />

this);<br />

tv.setText(" 这 是 一 个 测 试 <strong>Android</strong> 的 helloWorld");<br />

}<br />

}<br />

setContentView(tv);<br />

3<br />

运 行 as <strong>Android</strong><br />

9


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

4 代 码 分 析 :<br />

在 <strong>Android</strong> 中 , 用 户 界 面 控 件 被 封 装 成 了 各 种 Class 叫 做 Views。 一 个 View 是 一 个 可 以 显 示 的 控 件 对<br />

象 , 比 如 RadioButton,Animation,TextLable 等 。 其 中 的 一 个 简 单 的 控 件 是 TextView:<br />

TextView tv = new TextView(this<br />

this);<br />

传 入 TextView 构 造 函 数 的 参 数 是 一 个 Context 对 象 , 通 过 这 个 对 象 可 以 使 用 系 统 提 供 的 功 能 接 口 , 比<br />

如 加 载 资 源 , 访 问 数 据 库 和 共 享 数 据 等 等 。Activity 类 从 Context 类 继 承 而 来 , 所 以 Activity 本 身 是<br />

一 个 Context(Java 中 的 继 承 概 念 )。<br />

TextView 对 象 构 建 以 后 就 可 以 设 置 要 显 示 的 数 据 了 。<br />

tv.setText(" 这 是 一 个 测 试 <strong>Android</strong> 的 helloWorld");<br />

最 后 是 连 接 TextView 到 屏 幕 , 类 似 这 样 :<br />

setContentView(tv);<br />

setContentView() 方 法 可 以 控 制 具 体 哪 一 个 控 件 和 系 统 的 UI 联 系 起 来 ( 我 的 理<br />

解 是 设 置 为 主 显 示 View)。 如 果 没 有 设 置 , 屏 幕 中 将 会 显 示 空 白 。<br />

5<br />

结 果<br />

10


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

11


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

Apache Ant IDE 版 本<br />

------------JDK+<strong>Android</strong> SDK +Ant<br />

1. 必 须 软 件<br />

1 JAVA JDK SE 1.6 jdk-6u13-windows-i586-p.exe<br />

2 Google <strong>Android</strong> SDK android-sdk-windows-1.5_r1.zip<br />

3 Apache Ant apache-ant-1.7.1-bin.zip<br />

2. 安 装 过 程<br />

1 安 装 JAVA JDK SE 1.6<br />

‣ 设 置 环 境 变 量<br />

<br />

JAVA_HOME<br />

JAVA_HOME=C:\Program Files\Java\jdk1.6.0_13<br />

<br />

JAVA_JRE_HOME<br />

JAVA_JRE_HOME=C:\Program Files\Java\jdk1.6.0_13\jre<br />

<br />

JRE_HOME<br />

JRE_HOME=C:\Program Files\Java\jre6<br />

<strong>Android</strong>_SDK_HOME<br />

<strong>Android</strong>_SDK_HOME=C:\Mobile Phone DEV\<strong>Android</strong> SDK<br />

ANT_HOME<br />

ANT_HOME=C:\Mobile Phone DEV\Apache Ant\apache-ant-1.7.1<br />

CLASSPATH<br />

CLASSPATH=.;%ANT_HOME%\lib;%ANT_HOME%\lib\ant.jar;%JAVA_HOME%\lib;%JAV<br />

A_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar;%JRE_HOME%\lib;%JRE_HOME%\lib\r<br />

t.jar;%JAVA_JRE_HOME%\lib;%JAVA_JRE_HOME%\lib\rt.jar<br />

Path<br />

Path=%ANT_HOME%\bin;%<strong>Android</strong>_SDK_HOME%\tools;%JAVA_HOME%\bin;%JRE_HO<br />

ME%\bin;%JAVA_JRE_HOME%\bin;<br />

12


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

2<br />

解 压 Google <strong>Android</strong> SDK<br />

解 压 android-sdk-windows-1.5_r1.zip<br />

到 C:\Mobile Phone DEV\<strong>Android</strong> SDK<br />

3<br />

解 压 apache-ant-1.7.1.zip<br />

解 压 Apache Ant apache-ant-1.7.1.zip<br />

到 C:\Mobile Phone DEV\Apache Ant\apache-ant-1.7.1<br />

3.HelloWorld 程 序 实 例<br />

1 开 始 -> 运 行 ->cmd<br />

2 cd C:\Mobile Phone DEV\WorkSpace<br />

3 使 用 命 令 行 工 具 来 创 建 一 个 新 工 程<br />

android create project -k zyf.hello -n Hello<strong>Android</strong> -t 2 -a AntActivity -p ./Hello<br />

4 cd Hello<br />

5 ant debug<br />

6 cd bin<br />

7 emulator -avd <strong>Android</strong>_SDK1.5<br />

8 adb install ./hello-debug.apk<br />

9 在 模 拟 器 中 运 行 hello 程 序<br />

结 果<br />

13


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

Linux 平 台 :<br />

JDK+Eclipse+<strong>Android</strong> SDK+ADT<br />

JDK+<strong>Android</strong> SDK +Ant<br />

14


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

应 用 解 析<br />

Activity :<br />

活 动 是 最 基 本 的 <strong>Android</strong> 应 用 程 序 组 件 , 应 用 程 序 中 , 一 个 活 动 通 常 就 是 一 个 单 独 的 屏 幕 。 每 一 个 活 动<br />

都 被 实 现 为 一 个 独 立 的 类 , 并 且 从 活 动 基 类 中 继 承 而 来 , 活 动 类 将 会 显 示 由 视 图 控 件 组 成 的 用 户 接 口 , 并 对<br />

事 件 做 出 响 应 。 大 多 数 的 应 用 是 由 多 个 屏 幕 显 示 组 成 。 例 如 : 一 个 文 本 信 息 的 应 用 也 许 有 一 个 显 示 发 送 消 息 的<br />

联 系 人 列 表 屏 幕 , 第 二 个 屏 幕 用 来 写 文 本 消 息 和 选 择 收 件 人 , 再 来 一 个 屏 幕 查 看 消 息 历 史 或 者 消 息 设 置 操 作<br />

等 。 这 里 每 一 个 这 样 的 屏 幕 就 是 一 个 活 动 , 很 容 易 实 现 从 一 个 屏 幕 到 一 个 新 的 屏 幕 并 且 完 成 新 的 活 动 。 在 某<br />

些 情 况 下 当 前 的 屏 幕 也 许 需 要 向 上 一 个 屏 幕 活 动 提 供 返 回 值 -- 比 如 让 用 户 从 手 机 中 挑 选 一 张 照 片 返 回 通 讯 录<br />

做 为 电 话 拨 入 者 的 头 像 。<br />

当 一 个 新 的 屏 幕 打 开 后 , 前 一 个 屏 幕 将 会 暂 停 , 并 保 存 在 历 史 堆 栈 中 。 用 户 可 以 返 回 到 历 史 堆 栈 中 的 前<br />

一 个 屏 幕 。 当 屏 幕 不 再 使 用 时 , 还 可 以 从 历 史 堆 栈 中 删 除 。 默 认 情 况 下 ,<strong>Android</strong> 将 会 保 留 从 主 屏 幕 到 每 一<br />

个 应 用 的 运 行 屏 幕 。<br />

简 单 理 解 Activity 代 表 一 个 用 户 所 能 看 到 的 屏 幕 ,Activity 主 要 是 处 理 一 个 应 用 的 整 体 性 工 作 , 例 如 , 监<br />

听 系 统 事 件 ( 按 键 事 件 、 触 摸 屏 事 件 等 )、 为 用 户 显 示 指 定 的 View, 启 动 其 他 Activity 等 。 所 有 应 用 的 Activity<br />

都 继 承 于 android.app.Activity 类 , 该 类 是 <strong>Android</strong> 提 供 的 基 层 类 , 其 他 的 Activity 继 承 该 父 类 后 , 通 过 Override<br />

父 类 的 方 法 来 实 现 各 种 功 能 , 这 种 设 计 在 其 他 领 域 也 较 为 常 见 。<br />

Intent :<br />

调 用 <strong>Android</strong> 专 有 类 Intent 进 行 架 构 屏 幕 之 间 的 切 换 。Intent 是 描 述 应 用 想 要 做 什 么 。Intent 数 据 结 构 两<br />

个 最 重 要 的 部 分 是 动 作 和 动 作 对 应 的 数 据 。 典 型 的 动 作 类 型 有 :MAIN( 活 动 的 门 户 )、VIEW、PICK、EDIT<br />

等 。 而 动 作 对 应 的 数 据 则 以 URI 的 形 式 进 行 表 示 。 例 如 : 要 查 看 某 个 人 的 联 系 方 式 , 你 需 要 创 建 一 个 动 作 类<br />

型 为 VIEW 的 Intent, 以 及 一 个 表 示 这 个 人 的 URI。<br />

<strong>Android</strong> 使 用 了 Intent 这 个 特 殊 类 , 实 现 在 屏 幕 与 屏 幕 之 间 移 动 。Intent 类 用 于 描 述 一 个 应 用 将 会 做 什 么<br />

事 。 在 Intent 的 描 述 结 构 中 , 有 两 个 最 重 要 的 部 分 : 动 作 和 动 作 对 应 的 数 据 。 典 型 的 动 作 类 型 有 :M AIN(activity<br />

的 门 户 )、VIEW、PICK、EDIT 等 。 而 动 作 对 应 的 数 据 则 以 URI 的 形 式 进 行 表 示 。 例 如 : 要 查 看 一 个 人 的 联<br />

系 方 式 , 你 需 要 创 建 一 个 动 作 类 型 为 VIEW 的 intent, 以 及 一 个 表 示 这 个 人 的 URI。<br />

与 之 有 关 系 的 一 个 类 叫 IntentFilter。 相 对 于 intent 是 一 个 有 效 的 做 某 事 的 请 求 , 一 个 intentfilter 则 用 于 描<br />

述 一 个 activity( 或 者 IntentReceiver) 能 够 操 作 哪 些 intent。 一 个 activity 如 果 要 显 示 一 个 人 的 联 系 方 式 时 , 需<br />

要 声 明 一 个 IntentFilter, 这 个 IntentFilter 要 知 道 怎 么 去 处 理 VIEW 动 作 和 表 示 一 个 人 的 URI。IntentFilter 需<br />

要 在 <strong>Android</strong>Manifest.xml 中 定 义 。<br />

通 过 解 析 各 种 intent, 从 一 个 屏 幕 导 航 到 另 一 个 屏 幕 是 很 简 单 的 。 当 向 前 导 航 时 ,activity 将 会 调 用<br />

startActivity(IntentmyIntent) 方 法 。 然 后 , 系 统 会 在 所 有 安 装 的 应 用 程 序 中 定 义 的 IntentFilter 中 查 找 , 找 到 最<br />

匹 配 myIntent 的 Intent 对 应 的 activity。 新 的 activity 接 收 到 myIntent 的 通 知 后 , 开 始 运 行 。 当 startActivity 方<br />

法 被 调 用 将 触 发 解 析 myIntent 的 动 作 , 这 个 机 制 提 供 了 两 个 关 键 好 处 :<br />

15


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

A、Activities 能 够 重 复 利 用 从 其 它 组 件 中 以 Intent 的 形 式 产 生 的 一 个 请 求 ;<br />

B、Activities 可 以 在 任 何 时 候 被 一 个 具 有 相 同 IntentFilter 的 新 的 Activity 取 代 。<br />

IntentReceiver:<br />

当 你 希 望 你 的 应 用 能 够 对 一 个 外 部 的 事 件 ( 如 当 电 话 呼 入 时 , 或 者 数 据 网 络 可 用 时 , 或 者 到 了 晚 上 时 ) 做 出 响<br />

应 , 你 可 以 使 用 一 个 IntentReceiver。 虽 然 IntentReceiver 在 感 兴 趣 的 事 件 发 生 时 , 会 使 用 NotificationManager<br />

通 知 用 户 , 但 它 并 不 能 生 成 一 个 UI。IntentReceiver 在 <strong>Android</strong>Manifest.xml 中 注 册 , 但 也 可 以 在 代 码 中 使 用<br />

Context.registerReceiver() 进 行 注 册 。 当 一 个 intentreceiver 被 触 发 时 , 你 的 应 用 不 必 对 请 求 调 用 intentreceiver,<br />

系 统 会 在 需 要 的 时 候 启 动 你 的 应 用 。 各 种 应 用 还 可 以 通 过 使 用 Context.broadcastIntent() 将 它 们 自 己 的<br />

intentreceiver 广 播 给 其 它 应 用 程 序 。<br />

Service :<br />

一 个 Service 是 一 段 长 生 命 周 期 的 , 没 有 用 户 界 面 的 程 序 。 比 较 好 的 一 个 例 子 就 是 一 个 正 在 从 播 放 列 表 中<br />

播 放 歌 曲 的 媒 体 播 放 器 。 在 一 个 媒 体 播 放 器 的 应 用 中 , 应 该 会 有 多 个 activity, 让 使 用 者 可 以 选 择 歌 曲 并 播 放<br />

歌 曲 。 然 而 , 音 乐 重 放 这 个 功 能 并 没 有 对 应 的 activity, 因 为 使 用 者 当 然 会 认 为 在 导 航 到 其 它 屏 幕 时 音 乐 应 该<br />

还 在 播 放 的 。 在 这 个 例 子 中 , 媒 体 播 放 器 这 个 activity 会 使 用 Context.startService() 来 启 动 一 个 service, 从 而<br />

可 以 在 后 台 保 持 音 乐 的 播 放 。 同 时 , 系 统 也 将 保 持 这 个 service 一 直 执 行 , 直 到 这 个 service 运 行 结 束 。 另 外 ,<br />

我 们 还 可 以 通 过 使 用 Context.bindService() 方 法 , 连 接 到 一 个 service 上 ( 如 果 这 个 service 还 没 有 运 行 将 启 动<br />

它 )。 当 连 接 到 一 个 service 之 后 , 我 们 还 可 以 service 提 供 的 接 口 与 它 进 行 通 讯 。 拿 媒 体 播 放 器 这 个 例 子 来 说 ,<br />

我 们 还 可 以 进 行 暂 停 、 重 播 等 操 作 。<br />

Content Provider :<br />

<strong>Android</strong> 应 用 程 序 能 够 将 它 们 的 数 据 保 存 到 文 件 、SQLite 数 据 库 中 , 甚 至 是 任 何 有 效 的 设 备 中 。 当 你 想<br />

将 你 的 应 用 数 据 与 其 它 的 应 用 共 享 时 , 内 容 提 供 器 就 可 以 发 挥 作 用 了 。 因 为 内 容 提 供 器 类 实 现 了 一 组 标 准 的<br />

方 法 , 从 而 能 够 让 其 它 的 应 用 保 存 或 读 取 此 内 容 提 供 器 处 理 的 各 种 数 据 类 型 。<br />

数 据 是 应 用 的 核 心 。 在 <strong>Android</strong> 中 , 默 认 使 用 鼎 鼎 大 名 的 SQLite 作 为 系 统 DB。 但 是 在 <strong>Android</strong> 中 , 使 用 方<br />

法 有 点 小 小 的 不 一 样 。 在 <strong>Android</strong> 中 每 一 个 应 用 都 运 行 在 各 自 的 进 程 中 , 当 你 的 应 用 需 要 访 问 其 他 应 用 的 数<br />

据 时 , 也 就 需 要 数 据 在 不 同 的 虚 拟 机 之 间 传 递 , 这 样 的 情 况 操 作 起 来 可 能 有 些 困 难 ( 正 常 情 况 下 , 你 不 能 读 取<br />

其 他 的 应 用 的 db 文 件 ),ContentProvider 正 是 用 来 解 决 在 不 同 的 应 用 包 之 间 共 享 数 据 的 工 具 。<br />

• 所 有 被 一 个 <strong>Android</strong> 应 用 程 序 创 建 的 偏 好 设 置 , 文 件 和 数 据 库 都 是 私 有 的 。<br />

• 为 了 和 其 他 应 用 程 序 共 享 数 据 , 应 用 程 序 不 得 不 创 建 一 个 Content Provider<br />

• 要 回 索 其 他 应 用 程 序 的 数 据 , 它 自 己 的 Content Provider 必 须 被 调 用<br />

• <strong>Android</strong> 本 地 Content Provider 包 括 :<br />

‣ CallLog: 地 址 和 接 收 到 的 电 话 信 息<br />

‣ Contact.People.Phones: 存 储 电 话 号 码<br />

‣ Setting.System: 系 统 设 置 和 偏 好 设 置<br />

‣ 等 等<br />

16


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

封 面<br />

17


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

封 面<br />

1


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

<strong>Android</strong> 虚 拟 机 Dalvik<br />

Dalvik 冲 击<br />

随 着 Google 的 <strong>Android</strong>SDK 的 发 布 , 关 于 它 的 API 以 及 在 移 动 电 话 领 域 所 带 来 的 预<br />

期 影 响 这 些 方 面 的 讨 论 不 胜 枚 举 。 不 过 , 其 中 的 一 个 话 题 在 Java 社 区 是 一 石 激 起 千 层 浪 ,<br />

这 就 是 <strong>Android</strong> 平 台 的 基 础 ——Dalvik 虚 拟 机 。<br />

Dalvik 和 标 准 Java 虚 拟 机 (JVM) 首 要 差 别<br />

Dalvik 基 于 寄 存 器 , 而 JVM 基 于 栈 。, 基 于 寄 存 器 的 虚 拟 机 对 于 更 大 的 程 序 来 说 , 在 它 们 编 译 的 时 候 , 花 费<br />

的 时 间 更 短 。<br />

Dalvik 和 Java 运 行 环 境 的 区 别<br />

Dalvik 经 过 优 化 , 允 许 在 有 限 的 内 存 中 同 时 运 行 多 个 虚 拟 机 的 实 例 , 并 且 每 一 个 Dalvik 应 用 作 为 一 个 独 立 的<br />

Linux 进 程 执 行 。 独 立 的 进 程 可 以 防 止 在 虚 拟 机 崩 溃 的 时 候 所 有 程 序 都 被 关 闭 .<br />

Dalvik 形 势<br />

Dalvik 的 诞 生 也 导 致 人 们 开 始 忧 虑 Java 平 台 的 第 一 次 大 规 模 的 分 道 扬 镳 或 许 已 经 是 进 行 时 了 —— 有 人 已 经 把<br />

Davlik 和 微 软 的 JVM 以 及 Sun 对 微 软 的 诉 讼 联 系 起 来 , 等 着 看 Google 身 上 是 否 也 会 发 生 类 似 事 情 ; 另 外 一<br />

些 人 则 指 出 ,Google 并 没 有 宣 称 Dalvik 是 一 个 Java 实 现 , 而 微 软 却 是 这 样 做 的 。Sun 也 对 可 能 带 来 的 阵 营<br />

分 裂 表 达 了 忧 虑 情 绪 , 并 提 出 和 Google 合 作 来 保 证 Dalvik 和 JVM 之 间 的 兼 容 性 ——Google 对 此 的 解 释 是 ,<br />

Dalvik 是 对 解 决 目 前 JavaME 平 台 上 分 裂 的 一 次 尝 试 , 也 是 为 了 提 供 一 个 拥 有 较 少 限 制 许 可 证 的 平 台 。 甚 至<br />

还 有 人 怀 疑 这 是 否 是 Sun 和 Google 两 大 阵 营 对 Java 之 未 来 的 一 次 大 规 模 较 量 。<br />

2


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

<strong>Android</strong> 中 各 种 JAVA 包 的 功 能 描 述<br />

在 <strong>Android</strong> 的 应 用 程 序 开 发 中 , 通 常 使 用 的 是 JAVA 语 言 , 除 了 需 要 熟 悉 JAVA 语<br />

言 的 基 础 知 识 之 外 , 还 需 要 了 解 <strong>Android</strong> 提 供 的 扩 展 的 JAVA 功 能 。<br />

在 一 般 的 JAVA 应 用 中 , 如 果 需 用 引 用 基 础 类 库 , 通 常 需 要 使 用 如 下 的 方 式 :<br />

import javax.swing.*;<br />

以 上 代 码 表 示 了 引 用 JAVA 的 GUI 组 件 Swing,javax.swing 即 JAVA 中 的 一 个 包 。<br />

android 提 供 一 些 扩 展 的 JAVA 类 库 , 类 库 分 为 若 干 个 包 , 每 个 包 中 包 含 若 干 个 类 。<br />

重 要 包 的 描 述 :<br />

android.app : 提 供 高 层 的 程 序 模 型 、 提 供 基 本 的 运 行 环 境<br />

android.content : 包 含 各 种 的 对 设 备 上 的 数 据 进 行 访 问 和 发 布 的 类<br />

android.database : 通 过 内 容 提 供 者 浏 览 和 操 作 数 据 库<br />

android.graphics : 底 层 的 图 形 库 , 包 含 画 布 , 颜 色 过 滤 , 点 , 矩 形 , 可 以 将 他 们 直 接 绘 制 到 屏 幕 上 .<br />

android.location : 定 位 和 相 关 服 务 的 类<br />

android.media : 提 供 一 些 类 管 理 多 种 音 频 、 视 频 的 媒 体 接 口<br />

android.net : 提 供 帮 助 网 络 访 问 的 类 , 超 过 通 常 的 java.net.* 接 口<br />

android.os : 提 供 了 系 统 服 务 、 消 息 传 输 、IPC 机 制<br />

android.opengl : 提 供 OpenGL 的 工 具<br />

android.provider : 提 供 类 访 问 <strong>Android</strong> 的 内 容 提 供 者<br />

android.telephony : 提 供 与 拨 打 电 话 相 关 的 API 交 互<br />

android.view : 提 供 基 础 的 用 户 界 面 接 口 框 架<br />

android.util : 涉 及 工 具 性 的 方 法 , 例 如 时 间 日 期 的 操 作<br />

android.webkit : 默 认 浏 览 器 操 作 接 口<br />

android.widget : 包 含 各 种 UI 元 素 ( 大 部 分 是 可 见 的 ) 在 应 用 程 序 的 屏 幕 中 使 用<br />

3


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

<strong>Android</strong> 的 相 关 文 件 类 型<br />

Java 文 件 ----- 应 用 程 序 源 文 件<br />

android 本 身 相 当 一 部 分 都 是 用 java 编 写 而 成 ( 基 本 上 架 构 图 里 头 蓝 色 的 部 份 都 是 用 Java 开 发 的 ),android 的<br />

应 用 必 须 使 用 java 来 开 发 。<br />

Class 文 件 ------Java 编 译 后 的 目 标 文 件<br />

不 像 J2se,java 编 译 成 class 就 可 以 直 接 运 行 ,android 平 台 上 class 文 件 不 能 直 接 在 android 上 运 行 。 由 于 Google<br />

使 用 了 自 己 的 Dalvik 来 运 行 应 用 , 所 以 这 里 的 class 也 肯 定 不 能 在 <strong>Android</strong>Dalvik 的 java 环 境 中 运 行 ,android<br />

的 class 文 件 实 际 上 只 是 编 译 过 程 中 的 中 间 目 标 文 件 , 需 要 链 接 成 dex 文 件 后 才 能 在 dalvik 上 运 行 。<br />

Dex 文 件 -----<strong>Android</strong> 平 台 上 的 可 执 行 文 件<br />

<strong>Android</strong> 虚 拟 机 Dalvik 支 持 的 字 节 码 文 件 格 式 Google 在 新 发 布 的 <strong>Android</strong> 平 台 上 使 用 了 自 己 的 Dalvik 虚 拟 机<br />

来 定 义 , 这 种 虚 拟 机 执 行 的 并 非 Java 字 节 码 , 而 是 另 一 种 字 节 码 :dex 格 式 的 字 节 码 。 在 编 译 Java 代 码 之 后 ,<br />

通 过 <strong>Android</strong> 平 台 上 的 工 具 可 以 将 Java 字 节 码 转 换 成 Dex 字 节 码 。 虽 然 Google 称 Dalvik 是 为 了 移 动 设 备 定<br />

做 的 , 但 是 业 界 很 多 人 认 为 这 是 为 了 规 避 向 sun 申 请 Javalicense。 这 个 DalvikVM 针 对 手 机 程 式 /CPU 做 过 最<br />

佳 化 , 可 以 同 时 执 行 许 多 VM 而 不 会 占 用 太 多 Resource。<br />

Apk 文 件 -------<strong>Android</strong> 上 的 安 装 文 件<br />

Apk 是 <strong>Android</strong> 安 装 包 的 扩 展 名 , 一 个 <strong>Android</strong> 安 装 包 包 含 了 与 某 个 <strong>Android</strong> 应 用 程 序 相 关 的 所 有 文 件 。apk<br />

文 件 将 <strong>Android</strong>Manifest.xml 文 件 、 应 用 程 序 代 码 (.dex 文 件 )、 资 源 文 件 和 其 他 文 件 打 成 一 个 压 缩 包 。 一 个 工<br />

程 只 能 打 进 一 个 .apk 文 件 。<br />

4


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

<strong>Android</strong> 的 应 用 程 序 结 构 分 析 :HelloActivity<br />

本 例 以 一 个 简 单 的 HelloActivity 程 序 为 例 , 简 单 介 绍 <strong>Android</strong> 应 用 程 序 的 源 代 码 结 构 。 事 实<br />

上 ,<strong>Android</strong> 应 用 程 序 虽 然 不 是 很 复 杂 , 但 是 通 常 涉 及 了 JAVA 程 序 ,XML 文 件 ,Makefile<br />

多 方 面 的 内 容 。HelloActivity 虽 然 简 单 , 但 是 麻 雀 虽 小 , 五 脏 俱 全 , 是 学 习 <strong>Android</strong> 应 用 程<br />

序 的 最 好 示 例 。<br />

第 一 部 分 :HelloActivity<br />

的 源 代 码<br />

HelloActivity 工 程 的 源 代 码 在 <strong>Android</strong> 目 录 的 development/samples/HelloActivity/ 中 , 代 码 的<br />

结 构 如 下 所 示 :<br />

development/samples/HelloActivity/<br />

|-- <strong>Android</strong>.mk<br />

|-- <strong>Android</strong>Manifest.xml<br />

|-- res<br />

| |-- layout<br />

| | `-- hello_activity.xml<br />

| `-- values<br />

| `-- strings.xml<br />

|-- src<br />

| `-- com<br />

| `-- example<br />

| `-- android<br />

| `-- helloactivity<br />

| `-- HelloActivity.java<br />

`-- tests<br />

|-- <strong>Android</strong>.mk<br />

|-- <strong>Android</strong>Manifest.xml<br />

`-- src<br />

`-- com<br />

`-- android<br />

`-- helloactivity<br />

`-- HelloActivityTest.java<br />

其 中 tests 是 一 个 独 立 的 项 目 , 可 以 暂 时 不 考 虑 。 其 他 部 分 看 作 一 个 <strong>Android</strong> 的 一 应 用 程 序<br />

的 工 程 。 这 个 工 程 主 要 的 组 成 部 分 如 下 所 示 :<br />

<strong>Android</strong>Manifest.xml: 工 程 的 描 述 文 件 , 在 运 行 时 有 用 处<br />

<strong>Android</strong>.mk: 整 个 工 程 的 Makefile<br />

5


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

res: 放 置 资 源 文 件 的 目 录<br />

src/com/example/android/helloactivity/HelloActivity.java: 这 是 JAVA 类 文 件 , 这 个 文 件 的 路 径<br />

表 示 在 Andorid 的 JAVA 包 的 结 构 中 的 位 置 , 这 个 包 的 使 用 方 式 为<br />

com.example.android.helloactivity。<br />

第 二 部 分 : 编 译 的 中 间 结 果<br />

这 个 HelloActivity 工 程 经 过 编 译 后 将 生 成<br />

out/target/common/obj/APPS/He lloActivity_intermediates/ 目 录 , 这 个 目 录 中 的 内 容 都 是<br />

HelloActivity 工 程 相 关 的 , 更 具 体 地 说 都 与 development/samples/HelloActivity/ 中 的<br />

<strong>Android</strong>.mk 文 件 相 关 。<br />

out/target/common/obj/APPS/He lloActivity_intermediates/<br />

|-- classes.dex ( 字 节 码 )<br />

|-- classes.jar (JAR 文 件 )<br />

|-- public_resources.xml ( 根 据 resources 结 构 生 成 的 xml)<br />

`-- src<br />

|-- R.stamp<br />

`-- com<br />

`-- example<br />

`-- android<br />

`-- helloactivity<br />

`-- R.java (resources 生 成 的 文 件 )<br />

classes.dex<br />

是 一 个 最 重 要 的 文 件 , 它 是 给 <strong>Android</strong> 的 JAVA 虚 拟 机 Dalvik 运 行 的 字 节 码 文<br />

件 。<br />

classes.jar<br />

是 一 个 JAR 文 件 ,JAR 的 含 义 为 Java ARchive, 也 就 是 Java 归 档 , 是 一 种 与 平 台<br />

无 关 的 文 件 格 式 , 可 将 多 个 文 件 合 成 一 个 文 件 。 解 压 缩 之 后 的 目 录 结 构 :(JAVA 标 准 编 译 得<br />

到 的 类 )<br />

6


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

classes<br />

|-- META-INF<br />

| `-- MANIFEST.MF<br />

`-- com<br />

`-- example<br />

`-- android<br />

`-- helloactivity<br />

|-- HelloActivity.class<br />

|-- R$attr.class<br />

|-- R$id.class<br />

|-- R$layout.class<br />

|-- R$string.class<br />

`-- R.class<br />

各 个 以 class 为 扩 展 名 的 文 件 , 事 实 上 是 JAVA 程 序 经 过 编 译 后 的 各 个 类 的 字 节 码 。<br />

第 三 部 分 : 目 标 apk 文 件<br />

目 标 apk 文 件 是 <strong>Android</strong> 的 JAVA 虚 拟 机 Dalvik 安 装 和 运 行 的 文 件 , 事 实 上 这 个 apk 文 件 将<br />

由 编 译 的 中 间 结 果 和 原 始 文 件 生 成 。apk 文 件 的 本 质 是 一 个 zip 包 。 这 个 APK 包 解 压 缩 后 的<br />

目 录 结 构 如 下 所 示 :<br />

out/target/product/generic/obj/APPS/HelloActivity_intermediates/package.apk_FILES/<br />

|-- <strong>Android</strong>Manifest.xml<br />

|-- META-INF<br />

| |-- CERT.RSA<br />

| |-- CERT.SF<br />

| `-- MANIFEST.MF<br />

|-- classes.dex<br />

|-- res<br />

| `-- layout<br />

| `-- hello_activity.xml<br />

`-- resources.arsc<br />

值 得 注 意 的 是 , 这 里 的 xml 文 件 经 过 了 处 理 , 和 原 始 的 文 件 不 太 一 样 , 不 能 按 照 文 本 文 件<br />

的 方 式 阅 读 。<br />

7


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

第 四 部 分 : 源 代 码 的 各 个 文 件<br />

<strong>Android</strong>.mk 是 整 个 工 程 的 “Makefile”, 其 内 容 如 下 所 示 :<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

LOCAL_PATH:= $(call my-dir)<br />

include $(CLEAR_VARS)<br />

LOCAL_MODULE_TAGS := samples<br />

# Only compile source java files in this apk.<br />

LOCAL_SRC_FILES := $(call all-java-files-under, src)<br />

LOCAL_PACKAGE_NAME := HelloActivity<br />

LOCAL_SDK_VERSION := current<br />

include $(BUILD_PACKAGE)<br />

# Use the following include to make our test apk.<br />

include $(call all-makefiles-under,$(LOCAL_PATH))<br />

这 个 文 件 在 各 个 <strong>Android</strong> 的 工 程 中 都 是 类 似 的 , 其 中 LOCAL_PACKAGE_NAME 表 示 了 这<br />

个 包 的 名 字 。LOCAL_MODULE_TAGS 表 示 了 模 块 的 标 , 在 这 里 使 用 的 是<br />

samples, 正 式 的 应 用 程 序 (packages 目 录 中 的 应 用 ) 中 多 使 用 eng development。<br />

<strong>Android</strong>Manifest.xml 是 这 个 HelloActivity 工 程 的 描 述 文 件 , 其 内 容 如 下 所 示 :<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

其 中 package 用 于 说 明 这 个 包 的 名 称 ,android:labeapplication 中 的 内 容 是 表 示 这 个 应 用 程 序<br />

在 界 面 上 显 示 的 标 题 ,activity 中 的 android:name 表 示 这 个 <strong>Android</strong> 的 活 动 的 名 称 。<br />

8


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

文 件 src/com/example/android/helloactivity/HelloActivity.java 是 程 序 主 要 文 件 , 由 JAVA 语 言<br />

写 成<br />

package com.example.android.helloactivity;<br />

import android.app.Activity;<br />

import android.os.Bundle;<br />

public class HelloActivity extends Activity {<br />

public HelloActivity() {<br />

}<br />

@Override<br />

public void onCreate(Bundle savedInstanceState) {<br />

super.onCreate(savedInstanceState);<br />

setContentView(R.layout.hello_activity);<br />

}<br />

}<br />

com.example.android.helloactivity 表 示 的 是 这 个 包 的 名 称 , 在 文 件 的 头 部 引 入 了 两 个 包<br />

android.app.Activity 是 一 个 <strong>Android</strong> 活 动 ( Activity) 包 , 每 一 个 <strong>Android</strong> 活 动 都 需 要 继 承<br />

Activity 类 。<br />

包 android.os.Bundle 用 于 映 射 字 符 串 的 值 。<br />

onCreate() 是 一 个 重 载 的 函 数 , 在 这 个 函 数 中 实 现 应 用 程 序 创 建 的 所 执 行 的 过 程 。 其 中<br />

setContentView() 设 置 当 前 的 视 图 (View)。<br />

设 置 的 方 法 是 使 用 一 个 文 件 , 这 个 文 件 因 此 决 定 了 视 图 中 包 含 的 内 容 。 这 里 使 用 的 是<br />

R.layout.hello_activity, 表 示 从 res/layout/ 目 录 中 使 用 hello_activity.xml 文 件 。<br />

res/layout/hello_activity.xml 文 件 的 内 容 如 下 所 示 :<br />

<br />

<br />

其 中 定 义 了 一 个 可 编 辑 的 文 本 ( EditText), 下 面 的 各 项 其 实 是 它 的 各 种 属 性 , android:text 表 示 这 个 文 本 的<br />

内 容 ,string/hello_activity_text_text 表 示 找 到 相 应 的 文 件 , 也 就 是 res/value/string.xml 文 件 中 的<br />

hello_activity_text_text 文 本 。<br />

res/value/string.xml 的 内 容 如 下 所 示 :<br />

<br />

<br />

He llo, World!<br />

<br />

hello_activity_text_text 文 本 被 res/layout/hello_activity.xml 文 件 引 用 , 正 是 应 用 程 序 运 行 时 在<br />

屏 幕 显 示 的 文 本 。<br />

9


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

<strong>Android</strong>ADB<br />

ADB 工 具 使 用<br />

adb(<strong>Android</strong> Debug Bridge) 是 <strong>Android</strong> 提 供 的 一 个 通 用 调 试 工 具 , 借 助 这 个 工 具 , 我 妈 可 以 管 理 设 备 或 手 机 模<br />

拟 器 的 状 态 。<br />

adb 功 能 操 作 :<br />

<br />

<br />

<br />

<br />

快 速 更 新 设 备 或 手 机 模 拟 器 中 的 代 码 , 如 应 用 或 <strong>Android</strong> 系 统 升 级<br />

在 设 备 上 运 行 shell 命 令<br />

管 理 设 备 或 手 机 模 拟 器 上 预 定 端 口<br />

在 设 备 或 手 机 模 拟 器 上 复 制 、 粘 贴 文 件<br />

adb 常 用 操 作 :<br />

安 装 应 用 到 模 拟 器<br />

adb install app.apk<br />

<strong>Android</strong> 没 有 提 供 一 个 卸 载 应 用 的 命 令 , 只 能 手 动 删 除 :<br />

adb shell<br />

cd data/app<br />

rm app.apk<br />

进 入 设 备 或 模 拟 器 的 Shell<br />

adb shell<br />

通 过 以 上 命 令 , 可 以 进 入 设 备 或 模 拟 器 的 shell 环 境 中 , 在 这 个 Linux Shell 中 , 你 可 以 执 行 各 种 Linux 的 命 令 ,<br />

另 外 如 果 只 想 执 行 一 条 shell 命 令 , 可 以 采 用 以 下 方 式 :<br />

adb shell [command]<br />

如 :<br />

adb shell dmesg<br />

会 打 印 出 内 核 的 调 试 信 息<br />

发 布 端 口<br />

可 以 设 置 任 意 的 端 口 号 , 做 为 主 机 向 模 拟 器 或 设 备 的 请 求 端 口 。 如 :<br />

adb forward tcp:5555 tcp:8000<br />

10


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

复 制 文 件<br />

可 向 一 个 设 备 或 从 一 个 设 备 中 复 制 文 件<br />

复 制 一 个 文 件 或 目 录 到 设 备 或 模 拟 器 上 :<br />

adb push<br />

如 :<br />

adb push test.txt /tmp/test.txt<br />

从 设 备 或 模 拟 器 上 复 制 一 个 文 件 或 目 录<br />

adb pull<br />

如 :<br />

adb pull /android/lib/libwebcore.os<br />

搜 索 / 等 待 模 拟 器 、 设 备 实 例<br />

取 得 当 前 运 行 的 模 拟 器 、 设 备 的 实 例 列 表 及 每 个 实 例 的 状 态 | 等 待 正 在 运 行 的 设 备<br />

adb devices<br />

adb wait-for-device<br />

查 看 Bug 报 告<br />

adb bugreport<br />

记 录 无 线 通 讯 日 志<br />

无 线 通 讯 记 录 日 志 非 常 多 , 在 运 行 时 没 必 要 记 录 , 可 以 通 过 命 令 设 置 记 录<br />

adb shell<br />

logcat -b radio<br />

获 取 设 备 ID 和 序 列 号<br />

adb get-product<br />

adb get-serialno<br />

访 问 数 据 库 SQLite3<br />

adb shell<br />

sqlite3<br />

11


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

封 面<br />

12


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

封 面<br />

1


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

<strong>Android</strong> 模 拟 器<br />

模 拟 器 参 数<br />

参 数 格 式<br />

emulator [option] [-qemu args]<br />

option 选 项<br />

-sysdir <br />

为 模 拟 器 在 目 录 中 搜 索 系 统 硬 盘 镜 像<br />

-system <br />

为 模 拟 器 从 文 件 中 读 取 初 始 化 系 统 镜 像<br />

-datadir <br />

设 置 用 户 数 据 写 入 的 目 录<br />

-kernel <br />

为 模 拟 器 设 置 使 用 指 定 的 模 拟 器 内 核<br />

-ramdisk 设 置 内 存 RAM 镜 像 文 件 ( 默 认 为 /ramdisk.img)<br />

-image <br />

废 弃 , 使 用 -system 替 代<br />

-init-data <br />

设 置 初 始 化 数 据 镜 像 ( 默 认 为 /userdata.img)<br />

-initdata <br />

和 "-init-data " 使 用 方 法 一 致<br />

-data <br />

设 置 数 据 镜 像 ( 默 认 为 /userdata-qemu.img)<br />

-partition-size <br />

system/data 分 区 容 量 大 小 (MB)<br />

-cache 设 置 模 拟 器 缓 存 分 区 镜 像 ( 默 认 为 零 时 文 件 )<br />

-no-cache<br />

禁 用 缓 存 分 区<br />

-nocache<br />

与 "-no-cache" 使 用 方 法 相 同<br />

-sdcard <br />

指 定 模 拟 器 SDCard 镜 像 文 件 ( 默 认 为 /sdcard.img)<br />

-wipe-data 清 除 并 重 置 用 户 数 据 镜 像 ( 从 initdata 拷 贝 )<br />

-avd <br />

指 定 模 拟 器 使 用 <strong>Android</strong> 虚 拟 设 备<br />

-skindir 设 置 模 拟 器 皮 肤 在 目 录 中 搜 索 皮 肤 ( 默 认 为 /skins 目 录 )<br />

-skin <br />

选 择 使 用 给 定 的 皮 肤<br />

-no-skin<br />

不 适 用 任 何 模 拟 器 皮 肤<br />

-noskin<br />

使 用 方 法 与 "-no-skin" 相 同<br />

-memory <br />

物 理 RAM 内 存 大 小 (MB)<br />

-netspeed <br />

设 置 最 大 网 络 下 载 、 上 传 速 度<br />

-netdelay <br />

网 络 时 延 模 拟<br />

-netfast<br />

禁 用 网 络 形 态<br />

-tarce <br />

代 码 配 置 可 用<br />

-show-kernel<br />

显 示 内 核 信 息<br />

-shell<br />

在 当 前 终 端 中 使 用 根 Shell 命 令<br />

-no-jni<br />

Dalvik 运 行 时 禁 用 JNI 检 测<br />

-nojni<br />

使 用 方 法 与 "-no-jni" 相 同<br />

-logcat <br />

输 出 给 定 tag 的 Logcat 信 息<br />

2


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

-no-audio<br />

禁 用 音 频 支 持<br />

-noaudio<br />

与 "-no-audio" 用 法 相 同<br />

-audio <br />

使 用 指 定 的 音 频 backend<br />

-audio-in <br />

使 用 指 定 的 输 入 音 频 backend<br />

-audoi-out <br />

使 用 指 定 的 输 出 音 频 backend<br />

-raw-keys<br />

禁 用 Unicode 键 盘 翻 转 图<br />

-radio<br />

重 定 向 无 线 模 式 接 口 到 个 性 化 设 备<br />

-port <br />

设 置 控 制 台 使 用 的 TCP 端 口<br />

-ports , 设 置 控 制 台 使 用 的 TCP 端 口 和 ADB 调 试 桥 使 用 的 TCP 端 口<br />

-onion <br />

在 屏 幕 上 层 使 用 覆 盖 PNG 图 片<br />

-onion-alpha <br />

指 定 上 层 皮 肤 半 透 明 度<br />

-onion-rotation 0|1|2|3<br />

指 定 上 层 皮 肤 旋 转<br />

-scale <br />

调 节 模 拟 器 窗 口 尺 寸 ( 三 种 :1.0-3.0、dpi、auto)<br />

-dpi-device 设 置 设 备 的 resolution (dpi 单 位 ) ( 默 认 165)<br />

-http-proxy <br />

通 过 一 个 HTTP 或 HTTPS 代 理 来 创 建 TCP 连 接<br />

-timezone <br />

使 用 给 定 的 时 区 , 而 不 是 主 机 默 认 的<br />

-dns-server <br />

在 模 拟 系 统 上 使 用 给 定 的 DNS 服 务<br />

-cpu-delay <br />

调 节 CUP 模 拟<br />

-no-boot-anim<br />

禁 用 动 画 来 快 速 启 动<br />

-no-window<br />

禁 用 图 形 化 窗 口 显 示<br />

-version<br />

显 示 模 拟 器 版 本 号<br />

-report-console 向 远 程 socket 报 告 控 制 台 端 口<br />

-gps <br />

重 定 向 GPS 导 航 到 个 性 化 设 备<br />

-keyset <br />

指 定 按 键 设 置 文 件 名<br />

-shell-serial <br />

根 shell 的 个 性 化 设 备<br />

-old-system<br />

支 持 旧 版 本 (pre 1.4) 系 统 镜 像<br />

-tcpdump <br />

把 网 络 数 据 包 捕 获 到 文 件 中<br />

-bootchart <br />

bootcharting 可 用<br />

-qemu args....<br />

向 qemu 传 递 参 数<br />

-qemu -h<br />

显 示 qemu 帮 助<br />

-verbose<br />

和 "-debug-init" 相 同<br />

-debug <br />

可 用 、 禁 用 调 试 信 息<br />

-debug-<br />

使 指 定 的 调 试 信 息 可 用<br />

-debug-no-<br />

禁 用 指 定 的 调 试 信 息<br />

-help<br />

打 印 出 该 帮 助 文 档<br />

-help-<br />

打 印 出 指 定 option 的 帮 助 文 档<br />

-help-disk-images<br />

关 于 硬 盘 镜 像 帮 助<br />

-help-keys 支 持 按 钮 捆 绑 ( 手 机 快 捷 键 )<br />

-help-debug-tags<br />

显 示 出 -debug 命 令 中 的 tag 可 选 值<br />

-help-char-devices<br />

个 性 化 设 备 说 明<br />

-help-environment<br />

环 境 变 量<br />

-help-keyset-file<br />

指 定 按 键 绑 定 设 置 文 件<br />

-help-virtula-device<br />

虚 拟 设 备 管 理<br />

3


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

-help-sdk-images<br />

-help-build-images<br />

-help-all<br />

当 使 用 SDK 时 关 于 硬 盘 镜 像 的 信 息<br />

当 构 建 <strong>Android</strong> 时 , 关 于 硬 盘 镜 像 的 信 息<br />

打 印 出 所 有 帮 助<br />

4


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

进 程 :<br />

在 <strong>Android</strong> 中 , 进 程 完 全 是 应 用 程 序 的 实 现 细 节 , 不 是 用 户 一 般 想 象 的 那 样 。<br />

它 们 的 用 途 很 简 单 :<br />

<br />

<br />

<br />

<br />

通 过 把 不 信 任 或 是 不 稳 定 的 代 码 放 到 其 他 进 程 中 来 提 高 稳 定 性 或 是 安 全 性<br />

通 过 在 相 同 的 进 程 中 运 行 多 个 .apk 代 码 来 减 少 消 耗<br />

通 过 把 重 量 级 代 码 放 入 一 个 分 开 的 进 程 中 来 帮 助 系 统 管 理 资 源 。 该 分 开 的 进 程 可 以 被 应 用 程 序 的 其 他 部<br />

分 单 独 地 杀 死<br />

如 果 两 个 没 有 共 享 相 同 的 用 户 ID 的 .apk 试 图 在 相 同 的 进 程 中 运 行 , 这 将 不 被 允 许 , 并 且 系 统 会 为 每 一<br />

个 apk 程 序 创 建 不 同 的 进 程 会<br />

线 程<br />

<br />

<br />

<br />

<br />

<strong>Android</strong> 让 一 个 应 用 程 序 在 单 独 的 线 程 中 , 指 导 它 创 建 自 己 的 线 程<br />

应 用 程 序 组 件 (Activity、service、broadcast receiver) 所 有 都 在 理 想 的 主 线 程 中 实 例 化<br />

没 有 一 个 组 件 应 该 执 行 长 时 间 或 是 阻 塞 操 作 ( 例 如 网 络 呼 叫 或 是 计 算 循 环 ) 当 被 系 统 调 用 时 , 这 将 中 断 所<br />

有 在 该 进 程 的 其 他 组 件<br />

你 可 以 创 建 一 个 新 的 线 程 来 执 行 长 期 操 作<br />

5


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

<strong>Android</strong> 释 放 手 机 资 源 , 进 程 释 放 优 先 级<br />

当 系 统 资 源 消 耗 ,<strong>Android</strong> 将 会 杀 死 一 些 进 程 来 释 放 资 源 。<br />

进 程 优 先 级 顺 序 :<br />

1 前 台 进 程 :<br />

包 含 一 个 前 台 Activity、 包 含 一 个 正 在 运 行 的 广 播 接 收 器 、 正 在 运 行 的 服 务 ( 当 前 用 户 所 需 的 Activity、<br />

正 在 屏 幕 顶 层 运 行 的 Activity)<br />

2 可 视 进 程 :<br />

包 含 一 个 可 视 化 的 Activity(Activity 可 视 的 , 但 是 不 是 在 前 台 的 (onPause))、 例 如 显 示 在 一 个 前 台 对<br />

话 框 之 后 的 以 前 的 Activity)<br />

3 服 务 进 程 :<br />

包 含 一 个 被 开 启 的 服 务 ( 处 理 服 务 , 不 是 直 接 可 视 , 例 如 媒 体 播 放 器 , 网 络 上 传 、 下 载 )<br />

4 后 台 进 程 :<br />

包 含 一 个 不 可 视 的 Activity( 带 有 一 个 当 前 不 可 视 的 Activity、 可 以 在 任 意 时 刻 杀 死 该 进 程 来 回 收 内 存 )<br />

5<br />

空 进 程<br />

没 有 持 有 任 何 应 用 程 序 组 件<br />

6


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

<strong>Android</strong> 应 用 开 发 1<br />

分 析 Hello <strong>Android</strong><br />

打 开 Hello <strong>Android</strong> 工 程<br />

src 文 件 夹 Hello<strong>Android</strong>.java R.java <strong>Android</strong> Library Assets 文 件 夹<br />

源 文 件 主 程 序 文 件 资 源 文 件 Java 库 静 态 文 件 打 包<br />

res 文 件 夹<br />

drawable 文 件 夹 layout 文 件 夹 values 文 件 夹<br />

程 序 图 标 (ico.png) 布 局 UI (main.xml) 程 序 用 到 的 String、 颜 色 **(string.xml)<br />

<strong>Android</strong>Mainfest.xml<br />

描 述 应 用 程 序 、 构 成 、 组 件 、 权 限<br />

bin 文 件 夹<br />

classes.dex Hello<strong>Android</strong>.apk 自 定 义 的 包 文 件 夹<br />

编 译 的 java 二 进 制 码 <strong>Android</strong> 安 装 包 (APK 包 ) 存 放 编 译 后 的 字 节 码 文 件<br />

Main.xml<br />

整 体 布 局 表 示 线 性 布 局<br />

xmlns:android="http://schemas.android.com/apk/res/android"<br />

android:orientation="vertical" 控 件 布 局 垂 直 往 下 布 局<br />

android:layout_width="fill_parent"<br />

android:layout_height="fill_parent" 上 层 控 件 填 充 满<br />

名 字 空 间<br />

图 形 空 间 派 生 于 View<br />

<br />

横 向 填 充 满<br />

纵 向 按 实 际 高 度 填 充<br />

要 引 用 到 的 hello 字 符 串<br />

button 控 件 ID<br />

按 实 际 宽 度 高 度 显 示 填 充<br />

7


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

R.java<br />

通 过 res 文 件 夹 下 的 xml 文 件 定 义 自 动 生 成 的 ,main.xml ico.png string.xml 是 配 套 的 关 联 , 进 行 修 改 后<br />

R.java 自 动 重 新 生 成<br />

<strong>Android</strong>Manifest.xml<br />

有 关 版 本 , 程 序 信 息 ,java 包 , 程 序 图 标 , 程 序 记 录 信 息 等 。<br />

Manifest.xml 文 件 轮 廓<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

8


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

添 加 编 辑 框 与 按 钮<br />

package zyf.Study.<strong>Android</strong>SturdyByMyself;<br />

import android.app.Activity;<br />

import android.os.Bundle;<br />

import android.view.View;<br />

import android.view.View.OnClickListener;<br />

import android.widget.Button;<br />

import android.widget.EditText;<br />

import android.widget.TextView;<br />

public class <strong>Android</strong>SturdyByMyself extends Activity {<br />

private EditText getNameEditText;<br />

private Button button_Login;<br />

private TextView show_Login_TextView;<br />

/** Called when the activity is first created. */<br />

@Override<br />

public void onCreate(Bundle savedInstanceState) {<br />

super.onCreate(savedInstanceState);<br />

setContentView(R.layout.main);<br />

getNameEditText=(EditText)findViewById(R.id.widget29_getName_EditText);<br />

button_Login=(Button)findViewById(R.id.widget30_Login_Button);<br />

show_Login_TextView=(TextView)findViewById(R.id.widget31_showLogin_TextView);<br />

button_Login.setOnClickListener(new<br />

new OnClickListener(){<br />

@Override<br />

public void onClick(View v) {<br />

// TODO Auto-generated method stub<br />

show_Login_TextView.setText(getNameEditText.getText()+" 欢 迎 您 进 入 ");<br />

}<br />

});<br />

}<br />

}<br />

9


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

使 用 Intent 启 动 另 一 个 Activity<br />

Intent showNextPage_Intent=new<br />

new Intent();<br />

showNextPage_Intent.setClass(UsingBundel.this<br />

this,NextPageActivity.class<br />

class);<br />

startActivity(showNextPage_Intent);<br />

在 多 个 Activity 之 间 切 换 时 候 , 注 意 每 个 Activity 都 应 在 <strong>Android</strong>Manifest.xml 中 有 所 声<br />

明 定 义 ( 如 下 )<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

新 的 Activity<br />

在 <strong>Android</strong>Manifest.xml 中<br />

必 须 定 义 声 明<br />

在 不 同 Task 中 启 动 Activity<br />

Intent.FLAG_ACTIVITY_NEW_TASK<br />

10


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

<strong>Android</strong> 应 用 开 发 2<br />

Activity<br />

何 谓 Activity:<br />

最 简 单 的 就 是 你 可 以 把 Activity 看 成 一 个 User Interface Program, 原 则 上 它 会 提 供 使 用 者 一 个 交 互 式 的 接<br />

口 功 能 , 那 一 个 Activity 只 有 一 个 UI 吗 ? 非 也 , 举 例 来 说 : 一 个 email 程 序 , 就 可 能 包 含 三 个 Activity:<br />

• 邮 件 列 表 的 Activity<br />

• 显 示 邮 件 内 容 的 Activity<br />

• 写 新 邮 件 或 回 复 邮 件 的 Activity<br />

所 有 的 Activity 在 系 统 里 由 Activity 堆 栈 所 管 理 , 当 一 个 新 的 Activity 被 执 行 后 , 它 将 会 被 放 置 到 堆 栈 的<br />

最 顶 部 , 并 且 变 成 running Activity, 而 先 前 的 Activity 原 则 上 还 是 会 存 在 于 堆 栈 中 , 但 它 此 时 不 会 是 在 前 景<br />

的 情 况 , 除 非 刚 刚 那 个 新 的 Activity 离 开 。<br />

Intent 与 Intent filters<br />

Intent:<br />

<strong>Android</strong> 使 用 了 一 个 很 特 别 的 类 别 Intent, 用 来 从 一 个 画 面 跳 另 一 个 画 面 ,Intent 是 用 来 描 述 一 个 程<br />

序 想 要 做 些 什 么 事 情 。 在 Intent 的 数 据 结 构 中 有 两 个 很 重 要 的 部 分 , 一 个 是 动 作 (action) 及 对 数 据 产 生<br />

反 应 (data to act upon)。 Action 主 要 的 内 容 有 MAIN( 程 序 的 入 口 点 ),VIEW,PICK,EDIT 等 等 。Data<br />

则 是 用 URI 的 形 式 来 表 示 。 比 如 : 想 要 查 看 一 个 人 的 联 络 数 据 时 , 你 需 要 建 立 一 个 Intent, 它 包 含 了 VIEW<br />

的 动 作 (action) 及 指 向 该 人 数 据 的 URI 描 述 句 。<br />

Intent Filter :<br />

当 Intent 要 求 做 某 件 事 时 ,IntentFilter 被 用 来 描 述 这 个 Activity 能 够 做 些 什 么 事 情 。 比 如 一 个 Activity<br />

要 能 够 显 示 个 人 联 络 数 据 , 你 就 必 需 要 在 intentFilter 说 明 你 要 如 何 处 理 个 人 联 络 数 据 , 并 用<br />

ACTION_VIEW 呈 现 出 来 。IntentFilter 都 会 在 <strong>Android</strong>Manifest.xml 清 单 里 面 声 明 。<br />

11


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

Broadcast Intent Receiver<br />

当 你 想 要 写 一 个 程 序 来 对 外 部 的 事 件 做 些 处 理 时 , 可 以 实 用 Broadcast Intent Receiver 。 比 如 :<br />

当 电 话 响 铃 时 , 有 短 信 时 。 Broadcast Intent Receiver 它 并 不 能 够 拿 来 显 示 UI 画 面 , 它 必 需 利 用<br />

NotificationManager 来 通 知 使 用 者 它 们 感 兴 趣 的 事 件 发 生 了 。<br />

Broadcast Intent Receiver 同 样 的 可 以 在 <strong>Android</strong>Manifest.xml 中 声 明 , 但 你 也 可 以 用 写<br />

Context.registerReceiver() 程 序 的 方 式 来 注 册 你 自 己 的 Broadcast Intent Receiver。 你 自 己 的 程 序 并 不 会<br />

因 为 Broadcast Receiver 被 呼 叫 而 被 它 执 行 起 来 , 而 是 当 BroadcastReceiver 被 触 发 时 系 统 会 依 据 需 求 来 执<br />

行 相 应 的 程 序 。 程 序 可 以 利 用 Context.sendBroadcast() 来 发 出 它 们 自 己 的 IntentBroadcast 给 其 它 的 程 序 。<br />

Intent 与 Activity<br />

而 画 面 的 切 来 切 去 则 是 由 resolving Intent 来 实 现 的 。 当 你 想 产 生 新 的 画 面 时 , 现 行 的 Activity<br />

就 使 用 startActivity(myIntent)。 然 后 系 统 就 会 根 据 所 有 已 安 装 的 程 序 所 定 义 的 Intent filter 来 看 哪 个 程 序<br />

是 最 适 合 myIntent。 当 startActivity 被 呼 叫 时 ,resolving Intents 的 处 理 过 程 是 伴 随 而 来 的 。Resolving Intent<br />

提 供 我 们 两 个 好 处 :<br />

• 让 Activities 可 以 很 容 易 的 利 用 Intent 的 方 式 去 使 用 别 的 程 序 的 功 能 。<br />

• Activities 可 以 很 容 易 的 在 任 何 情 况 下 由 新 的 Activity 所 取 代 。<br />

12


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

添 加 新 的 Activity<br />

package zyf.<strong>Android</strong>.Study;<br />

import ……<br />

import android.content.Intent;<br />

import android.net.Uri;<br />

import android.view.View.OnClickListener;<br />

public class <strong>Android</strong>Study_TWO extends Activity {<br />

@Override<br />

public void onCreate(Bundle savedInstanceState) {<br />

super.onCreate(savedInstanceState);<br />

setContentView(R.layout.main);<br />

final EditText inName = (EditText) findViewById(R.id.name);<br />

final TextView result = (TextView) findViewById(R.id.result);<br />

Button button_Start_Browser = (Button) findViewById(R.id.submit_toNET);<br />

Button button_Login=(Button) findViewById(R.id.show_Login);<br />

Button button_showLoginName=<br />

(Button)findViewById(R.id.submit_toshowLoingName);<br />

button_Start_Browser.setOnClickListener(new<br />

new OnClickListener(){<br />

@Override<br />

public void onClick(View v) {<br />

Uri myUri = Uri.parse("http://www.flashwing.net");<br />

Intent openBrowserIntent = new Intent(Intent.ACTION_VIEW,myUri);<br />

startActivity(openBrowserIntent);<br />

}<br />

});<br />

button_Login.setOnClickListener(new<br />

new OnClickListener(){<br />

@Override<br />

public void onClick(View v) {<br />

Intent openWelcomeActivityIntent=new<br />

new Intent();<br />

openWelcomeActivityIntent.setClass(<strong>Android</strong>Study_TWO.this<br />

this,<br />

Welcome.class<br />

class);<br />

startActivity(openWelcomeActivityIntent);<br />

}<br />

});<br />

button_showLoginName.setOnClickListener(new<br />

new OnClickListener(){<br />

@Override<br />

public void onClick(View v) {<br />

result.setText(inName.getText()+" 欢 迎 您 进 入 ");<br />

}<br />

});<br />

}<br />

}<br />

13


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

封 面<br />

14


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

封 面<br />

1


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

<strong>Android</strong> 应 用 开 发 3<br />

使 用 Bundle 在 Activity 间 传 递 数 据<br />

从 源 Activity 中 传 递 数 据<br />

// 数 据 写 入 Intent<br />

Intent openWelcomeActivityIntent=new<br />

new Intent();<br />

Bundle myBundelForName=new<br />

new Bundle();<br />

myBundelForName.putString("Key_Name",inName.getText().toString());<br />

myBundelForName.putString("Key_Age",inAge.getText().toString());<br />

openWelcomeActivityIntent.putExtras(myBundelForName);<br />

openWelcomeActivityIntent.setClass(<strong>Android</strong>Bundel.this<br />

this, Welcome.class<br />

class);<br />

startActivity(openWelcomeActivityIntent);<br />

目 标 Activity 中 获 取 数 据<br />

// 从 Intent 中 获 取 数 据<br />

Bundle myBundelForGetName=this<br />

this.getIntent().getExtras();<br />

String name=myBundelForGetName.getString("Key_Name");<br />

myTextView_showName.setText(" 欢 迎 您 进 入 :"+name);<br />

使 用 Bundle 在 Activity 间 传 递 数 据 2<br />

从 源 请 求 Activity 中 通 过 一 个 Intent 把 一 个 服 务 请 求 传 到 目 标 Activity 中<br />

private Intent toNextIntent;//Intent 成 员 声 明<br />

toNextIntent=new<br />

new Intent();//Intent 定 义<br />

toNextIntent.setClass(TwoActivityME3.this<br />

this, SecondActivity3.class<br />

class);<br />

// 设 定 开 启 的 下 一 个 Activity<br />

startActivityForResult(toNextIntent, REQUEST_ASK);<br />

// 开 启 Intent 时 候 , 把 请 求 码 同 时 传 递<br />

2


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

在 源 请 求 Activity 中 等 待 Intent 返 回 应 答 结 果 , 通 过 重 载 onActivityResult() 方 法<br />

@Override<br />

protected void onActivityResult(int<br />

int requestCode,<br />

int resultCode, Intent data) {<br />

// TODO Auto-generated method stub<br />

super.onActivityResult(requestCode, resultCode, data);<br />

if(requestCode==REQUEST_ASK){<br />

if(resultCode==RESULT_CANCELED){<br />

}<br />

}<br />

setTitle("Cancel****");<br />

}else<br />

if(resultCode==RESULT_OK){<br />

}<br />

showBundle=data.getExtras();// 从 返 回 的 Intent 中 获 得 Bundle<br />

Name=showBundle.getString("myName");// 从 bundle 中 获 得 相 应 数 据<br />

text.setText("the name get from the second layout:\n"+Name);<br />

☻ 第 一 个 参 数 是 你 开 启 请 求 Intent 时 的 对 应 请 求 码 , 可 以 自 己 定 义 。<br />

☻ 第 二 个 参 数 是 目 标 Activity 返 回 的 验 证 结 果 码<br />

☻ 第 三 个 参 数 是 目 标 Activity 返 回 的 Intent<br />

目 标 Activity 中 发 送 请 求 结 果 代 码 , 连 同 源 Activity 请 求 的 数 据 一 同 绑 定 到 Bundle<br />

中 通 过 Intent 传 回 源 请 求 Activity 中<br />

backIntent=new<br />

new Intent();<br />

stringBundle=new<br />

new Bundle();<br />

stringBundle.putString("myName", Name);<br />

backIntent.putExtras(stringBundle);<br />

setResult(RESULT_OK, backIntent);// 返 回 Activity 结 果 码<br />

finish();<br />

Log 与 DDMS( 查 看 Log 等 信 息 )<br />

Log.v("TAG", "nextPage_Activity onStart()");// 设 置 标 签 来 跟 踪 程 序<br />

3


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

Activity 生 命 周 期<br />

Activity 状 态<br />

1<br />

当 一 个 Activity 在 屏 幕 的 最 上 层 时 ( 对 堆 栈 的 最 顶 端 ), 它 就 是 属 于 active 或 者 running 的 状 态<br />

2 如 果 一 个 Activity 失 去 焦 点 (focus) 但 还 看 得 到 它 的 画 面 ( 比 如 : 一 个 新 的 Activity 画 面 并 不 是 全<br />

屏 幕 或 者 它 是 一 个 半 透 明 的 情 况 ), 那 失 去 焦 点 的 Activity 则 处 在 paused 的 状 态 。 像 这 个 失 去 焦 点 的 Activity<br />

它 还 是 完 全 活 着 的 , 并 没 有 消 失 。( 活 着 的 意 思 是 指 ,Activity 自 己 本 身 所 有 的 状 态 及 数 据 都 还 是 存 在 的 , 也<br />

跟 窗 口 管 理 程 序 window manager 保 持 联 系 着 ), 像 这 种 paused 的 Activity, 会 在 一 种 情 况 下 消 失 , 那 就 是 当<br />

系 统 的 内 存 不 够 用 之 时 , 系 统 会 自 动 判 断 , 八 部 重 要 的 Activity 移 除 。<br />

3 如 果 一 个 Activity 被 其 它 的 Activity 完 全 的 遮 盖 住 时 , 它 仍 然 保 有 全 部 的 状 态 及 数 据 , 但 因 为 它 已<br />

不 再 被 使 用 者 看 见 , 所 以 它 的 画 面 是 被 隐 藏 起 来 的 ( 画 面 不 需 要 更 新 ), 当 系 统 内 存 不 足 时 , 这 种 stop 状 态<br />

的 Activity 时 最 先 被 系 统 考 虑 拿 下 来 释 放 内 存 的 。<br />

4<br />

当 一 个 Activity 处 于 pause 或 stop 的 状 态 时 , 系 统 可 以 要 求 Activity 结 束 (finish) 或 直 接 移 除 (kill)<br />

它 。 当 它 需 要 再 度 呈 现 在 使 用 者 面 前 时 , 它 必 须 要 能 完 整 的 重 新 启 动 及 回 复 先 前 的 状 态 。<br />

Activity 状 态 转 换 图<br />

4


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

<strong>Android</strong> 应 用 开 发 4 使 用 Service<br />

什 么 是 服 务 (Service<br />

Service)<br />

服 务 是 运 行 在 后 台 的 一 段 代 码 。 它 可 以 运 行 在 它 自 己 的 进 程 , 也 可 以 运 行 在 其 他 应 用 程 序 的 上 下 文<br />

(context) 里 面 , 这 取 决 于 自 身 的 需 要 。 其 他 的 组 件 可 以 绑 定 到 一 个 服 务 (Service) 上 面 , 通 过 远 程 过 程 调<br />

用 (RPC) 来 调 用 这 个 方 法 。 例 如 : 媒 体 播 放 器 的 服 务 , 当 用 户 退 出 媒 体 选 择 用 户 界 面 , 仍 然 希 望 音 乐 可 以<br />

继 续 播 放 , 这 时 就 是 由 服 务 (Service) 来 保 证 当 用 户 界 面 关 闭 时 音 乐 继 续 播 放 的 。<br />

如 何 使 用 服 务<br />

<br />

<br />

第 一 种 是 通 过 调 用 Context.startServece() 启 动 , 调 用 Context.stoptService() 结 束 ,startService() 可 以 传 递 参<br />

数 给 Service。<br />

第 二 种 方 式 是 通 过 调 用 Context.bindService() 启 动 , 调 用 Context.unbindService() 结 束 , 还 可 以 通 过<br />

ServiceConnection 访 问 Service。 二 者 可 以 混 合 使 用 , 比 如 说 我 可 以 先 startServece() 再 unbindService()。<br />

Service 的 生 命 周 期<br />

☻<br />

☻<br />

☻<br />

startService() 后 , 即 使 调 用 startService() 的 进 程 结 束 了 ,Service 仍 然 还 存 在 , 知 道 有 进 程 调 用<br />

stoptService(), 或 者 Service 自 己 自 杀 (stopSelf()) 就 没 法 了<br />

bindService() 后 ,Service 就 和 调 用 bindService() 的 进 程 同 生 共 死 , 也 就 是 说 当 调 用 bindService() 的 进<br />

程 死 了 , 那 么 它 bind 的 Service 也 要 跟 着 被 结 束 , 当 然 期 间 也 可 以 调 用 unbindService() 让 Service 结<br />

束<br />

两 种 方 式 混 合 使 用 时 , 比 如 说 你 startService() 了 , 我 bindService() 了 , 那 么 只 有 你 stoptService() 了 而<br />

且 我 也 unbindService() 了 , 这 个 Service 才 会 被 结 束 。<br />

进 程 生 命 周 期<br />

♠<br />

<strong>Android</strong> 系 统 将 会 尝 试 保 留 那 些 启 动 了 的 或 者 时 绑 定 了 的 服 务 进 程<br />

♠<br />

如 果 该 服 务 正 在 进 程 的 onCreate(),onStart() 或 者 onDestroy() 这 些 方 法 中 执 行 时 , 那 么 主 进 程 将 会 成 为<br />

一 个 前 台 进 程 , 以 确 保 此 代 码 不 会 被 停 止<br />

♠<br />

如 果 服 务 已 经 开 始 , 那 么 它 的 主 进 程 会 就 重 要 性 而 言 低 于 所 有 可 见 的 进 程 但 高 于 不 可 见 的 进 程 , 由<br />

于 只 有 少 数 几 个 进 程 是 用 户 可 见 的 , 所 以 只 要 不 是 内 存 特 别 低 , 该 服 务 不 会 停 止 。<br />

♠<br />

如 果 有 多 个 客 户 端 绑 定 了 服 务 , 只 要 客 户 端 中 的 一 个 对 于 用 户 是 可 见 的 , 即 认 为 该 服 务 可 见<br />

5


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

使 用 服 务 进 行 音 乐 播 放<br />

Manifest.xml<br />

中 的 Service<br />

定 义<br />

Service 子 类<br />

中 的 Player<br />

Activity 中 定<br />

义 的 Intent<br />

开 启 相 应 的<br />

Service<br />

<br />

<br />

<br />

<br />

<br />

<br />

public void onStart(Intent intent, int startId) {<br />

super.onStart(intent, startId);<br />

player = MediaPlayer.create(this, R.raw.seven_days);<br />

player.start();<br />

}<br />

public void onDestroy() {<br />

super.onDestroy();<br />

player.stop();<br />

}<br />

startService(new Intent("com.liangshan.wuyong.START_AUDIO_SERVICE"));<br />

stopService(new Intent("com.liangshan.wuyong.START_AUDIO_SERVICE"));<br />

6


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

<strong>Android</strong> UI 布 局<br />

Activity<br />

<br />

<br />

<strong>Android</strong> 应 用 程 序 基 本 功 能 单 元<br />

本 身 没 有 任 何 屏 幕 存 在<br />

View 和 Viewgroup<br />

<br />

表 示 在 <strong>Android</strong> 平 台 上 的 基 本 用 户 界 面 单 元<br />

Views<br />

android.view.View<br />

‣ 为 指 定 的 屏 幕 矩 形 区 域 存 储 布 局 和 内 容<br />

‣ 处 理 尺 寸 和 布 局 , 绘 制 , 焦 点 改 变 , 翻 屏 , 按 键 、 手 势<br />

‣ widget 基 类<br />

文 本 TextView<br />

输 入 框 EditText<br />

输 入 法 InputMethod<br />

活 动 方 法 MovementMethod<br />

按 钮 Button<br />

单 选 按 钮 RadioButton<br />

复 选 框 Checkbox<br />

滚 动 视 图 ScrollView<br />

Viewgroups<br />

<br />

android.view.Viewgroup<br />

‣ 包 含 并 管 理 下 级 系 列 的 Views 和 其 他 Viewgroup<br />

‣ 布 局 的 基 类<br />

UI 树 状 结 构<br />

<br />

<br />

<strong>Android</strong> 中 的 Activity<br />

‣ 定 义 使 用 一 个 view 和 iewgroup 的 树 状 节 点<br />

setContentView() 方 法<br />

‣ 被 Activity 调 用 来 把 树 状 节 点 连 接 到 屏 幕 渲 染<br />

7


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

LayoutParams ( 布 局 参 数 )<br />

<br />

每 一 个 viewgroup 类 使 用 一 个 继 承 于 ViewGroup.LayoutParams 的 嵌 套 类<br />

‣ 包 含 定 义 了 子 节 点 View 的 尺 寸 和 位 置 的 属 性 类 型<br />

普 通 布 局 对 象<br />

FrameLayout<br />

<br />

<br />

<br />

<br />

最 简 单 的 布 局 对 象<br />

在 屏 幕 上 故 意 保 留 的 空 白 空 间 , 你 可 以 之 后 填 充 一 个 单 独 的 对 象<br />

‣ 例 如 : 一 个 你 要 更 换 的 图 片<br />

所 有 子 元 素 都 钉 到 屏 幕 的 左 上 角<br />

不 能 为 子 元 素 指 定 位 置<br />

LinearLayout<br />

<br />

在 一 个 方 向 上 ( 垂 直 或 水 平 ) 对 齐 所 有 子 元 素<br />

‣ 所 有 子 元 素 一 个 跟 一 个 地 堆 放<br />

一 个 垂 直 列 表 每 行 将 只 有 一 个 子 元 素 ( 无 论 它 们 有 多 宽 )<br />

一 个 水 平 列 表 只 是 一 列 的 高 度 ( 最 高 子 元 素 的 高 度 来 填 充 )<br />

8


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

TableLayout<br />

<br />

<br />

<br />

把 子 元 素 放 入 到 行 与 列 中<br />

不 显 示 行 、 列 或 是 单 元 格 边 界 线<br />

单 元 格 不 能 横 跨 行 , 如 HTML 中 一 样<br />

AbsoluteLayout<br />

使 子 元 素 能 够 指 明 确 切 的 X / Y 坐 标 显 示 在 屏 幕 上<br />

‣ (0,0) 是 左 上 角<br />

‣ 当 你 下 移 或 右 移 时 , 坐 标 值 增 加<br />

允 许 元 素 重 叠 ( 但 是 不 推 荐 )<br />

注 意 :<br />

‣ 一 般 建 议 不 使 用 AbsoluteLayout 除 非 你 有 很 好 的 理 由 来 使 用 它<br />

‣ 因 为 它 相 当 严 格 并 且 在 不 同 的 设 备 显 示 中 不 能 很 好 地 工 作<br />

RelativeLayout<br />

<br />

让 子 元 素 指 定 它 们 相 对 于 其 他 元 素 的 位 置 ( 通 过 ID 来 指 定 ) 或 相 对 于 父 布 局 对 象<br />

9


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

<strong>Android</strong>Manifest.xml 中 修 改 程 序 布 局 的 Theme 主 题<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

10


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

封 面<br />

11


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

封 面<br />

1


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

<strong>Android</strong> 基 础 UI 编 程 1<br />

更 改 与 显 示 文 字 标 签<br />

TextView 标 签 的 使 用<br />

1 导 入 TextView 包<br />

import android.widget.TextView;<br />

2 在 mainActivity.java 中 声 明 一 个 TextView<br />

private TextView mTextView01;<br />

3<br />

在 main.xml 中 定 义 一 个 TextView<br />

<br />

<br />

4<br />

利 用 findViewById() 方 法 获 取 main.xml 中 的 TextView<br />

mTextView01 = (TextView) findViewById(R.id.TextView01);<br />

5<br />

设 置 TextView 标 签 内 容<br />

String str_2 = " 欢 迎 来 到 <strong>Android</strong> 的 TextView 世 界 ...";<br />

mTextView01.setText(str_2);<br />

6 设 置 文 本 超 级 链 接<br />

<br />

2


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

android.graphics.Color 实 践 ----Color 颜 色 变 幻<br />

android.graphics.Color 包 含 颜 色 值<br />

Color.BLACK<br />

Color.BLUE<br />

Color.CYAN<br />

Color.DKGRAY<br />

Color.GRAY<br />

Color.GREEN<br />

Color.LTGRAY<br />

Color.MAGENTA<br />

Color.RED<br />

Color.TRANSPARENT<br />

Color.WHITE<br />

Color.YELLOW<br />

黑 色<br />

蓝 色<br />

青 绿 色<br />

灰 黑 色<br />

灰 色<br />

绿 色<br />

浅 灰 色<br />

红 紫 色<br />

红 色<br />

透 明<br />

白 色<br />

黄 色<br />

编 程 实 现 颜 色 变 幻<br />

1<br />

新 建 工 程<br />

2 修 改 mainActivity.java 文 件 , 添 加 12 个 TextView 对 象 变 量 , 一 个 LinearLayout 对 象 变 量 、 一 个 WC<br />

整 数 变 量 、 一 个 LinearLayout.LayoutParams 变 量 。<br />

package zyf.ManyColorME;<br />

/* 导 入 要 使 用 的 包 */<br />

import android.app.Activity;<br />

import android.graphics.Color;<br />

import android.os.Bundle;<br />

import android.widget.LinearLayout;<br />

import android.widget.TextView;<br />

public class ManyColorME extends Activity {<br />

/** Called when the activity is first created. */<br />

/* 定 义 使 用 的 对 象 */<br />

private LinearLayout myLayout;<br />

private LinearLayout.LayoutParams layoutP;<br />

private int WC = LinearLayout.LayoutParams.WRAP_CONTENT;<br />

private TextView black_TV, blue_TV, cyan_TV, dkgray_TV,<br />

gray_TV, green_TV,ltgray_TV, magenta_TV, red_TV,<br />

transparent_TV, white_TV, yellow_TV;<br />

@Override<br />

public void onCreate(Bundle savedInstanceState) {<br />

3


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

}<br />

super.onCreate(savedInstanceState);<br />

/* 实 例 化 一 个 LinearLayout 布 局 对 象 */<br />

myLayout = new LinearLayout(this<br />

this);<br />

/* 设 置 LinearLayout 的 布 局 为 垂 直 布 局 */<br />

myLayout.setOrientation(LinearLayout.VERTICAL);<br />

/* 设 置 LinearLayout 布 局 背 景 图 片 */<br />

myLayout.setBackgroundResource(R.drawable.back);<br />

/* 加 载 主 屏 布 局 */<br />

setContentView(myLayout);<br />

/* 实 例 化 一 个 LinearLayout 布 局 参 数 , 用 来 添 加 View */<br />

layoutP = new LinearLayout.LayoutParams(WC, WC);<br />

/* 构 造 实 例 化 TextView 对 象 */<br />

constructTextView();<br />

/* 把 TextView 添 加 到 LinearLayout 布 局 中 */<br />

addTextView();<br />

/* 设 置 TextView 文 本 颜 色 */<br />

setTextViewColor();<br />

/* 设 置 TextView 文 本 内 容 */<br />

setTextViewText();<br />

/* 设 置 TextView 文 本 内 容 */<br />

public void setTextViewText() {<br />

}<br />

black_TV.setText(" 黑 色 ");<br />

blue_TV.setText(" 蓝 色 ");<br />

cyan_TV.setText(" 青 绿 色 ");<br />

dkgray_TV.setText(" 灰 黑 色 ");<br />

gray_TV.setText(" 灰 色 ");<br />

green_TV.setText(" 绿 色 ");<br />

ltgray_TV.setText(" 浅 灰 色 ");<br />

magenta_TV.setText(" 红 紫 色 ");<br />

red_TV.setText(" 红 色 ");<br />

transparent_TV.setText(" 透 明 ");<br />

white_TV.setText(" 白 色 ");<br />

yellow_TV.setText(" 黄 色 ");<br />

/* 设 置 TextView 文 本 颜 色 */<br />

public void setTextViewColor() {<br />

black_TV.setTextColor(Color.BLACK);<br />

blue_TV.setTextColor(Color.BLUE);<br />

dkgray_TV.setTextColor(Color.DKGRAY);<br />

gray_TV.setTextColor(Color.GRAY);<br />

green_TV.setTextColor(Color.GREEN);<br />

ltgray_TV.setTextColor(Color.LTGRAY);<br />

magenta_TV.setTextColor(Color.MAGENTA);<br />

4


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

}<br />

red_TV.setTextColor(Color.RED);<br />

transparent_TV.setTextColor(Color.TRANSPARENT);<br />

white_TV.setTextColor(Color.WHITE);<br />

yellow_TV.setTextColor(Color.YELLOW);<br />

}<br />

/* 构 造 实 例 化 TextView 对 象 */<br />

public void constructTextView() {<br />

black_TV = new TextView(this<br />

this);<br />

blue_TV = new TextView(this<br />

this);<br />

cyan_TV = new TextView(this<br />

this);<br />

dkgray_TV = new TextView(this<br />

this);<br />

gray_TV = new TextView(this<br />

this);<br />

green_TV = new TextView(this<br />

this);<br />

ltgray_TV = new TextView(this<br />

this);<br />

magenta_TV = new TextView(this<br />

this);<br />

red_TV = new TextView(this<br />

this);<br />

transparent_TV = new TextView(this<br />

this);<br />

white_TV = new TextView(this<br />

this);<br />

yellow_TV = new TextView(this<br />

this);<br />

}<br />

/* 把 TextView 添 加 到 LinearLayout 布 局 中 */<br />

public void addTextView() {<br />

myLayout.addView(black_TV, layoutP);<br />

myLayout.addView(blue_TV, layoutP);<br />

myLayout.addView(cyan_TV, layoutP);<br />

myLayout.addView(dkgray_TV, layoutP);<br />

myLayout.addView(gray_TV, layoutP);<br />

myLayout.addView(green_TV, layoutP);<br />

myLayout.addView(ltgray_TV, layoutP);<br />

myLayout.addView(magenta_TV, layoutP);<br />

myLayout.addView(red_TV, layoutP);<br />

myLayout.addView(transparent_TV, layoutP);<br />

myLayout.addView(white_TV, layoutP);<br />

myLayout.addView(yellow_TV, layoutP);<br />

}<br />

5


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

3<br />

结 果<br />

6


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

android.graphics.Typeface 实 践<br />

字 体 风 格 Typeface 种 类<br />

int Style 类 型<br />

BOLD<br />

BOLD_ITALIC<br />

ITALIC<br />

NORMAL<br />

粗 体<br />

粗 斜 体<br />

斜 体<br />

普 通 字 体<br />

Typeface 类 型<br />

DEFAULT<br />

DEFAULT_BOLD<br />

MONOSPACE<br />

SANS_SERIF<br />

SERIF<br />

默 认 字 体<br />

默 认 粗 体<br />

单 间 隔 字 体<br />

无 衬 线 字 体<br />

衬 线 字 体<br />

Typeface.create(Typeface family,int style)<br />

创 建 一 个 混 合 型 新 的 字 体 : 有 4*5 中 搭 配<br />

Typeface.setTypeface (Typeface tf, int style)<br />

设 置 一 个 混 合 型 字 体 : 有 4*5 中 搭 配<br />

Typeface.setTypeface(Typeface tf)<br />

设 置 一 个 只 有 Typeface 风 格 的 字 体 : 有 五 种 形 式<br />

7


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

编 程 实 现 以 上 静 态 域 字 体<br />

1<br />

创 建 新 工 程<br />

2 修 改 mianActivity.java, 实 现 多 种 字 体 TextView 显 示<br />

package zyf.TypefaceStudy;<br />

/* 导 入 要 使 用 的 包 */<br />

import android.app.Activity;<br />

import android.graphics.Color;<br />

import android.graphics.Typeface;<br />

import android.os.Bundle;<br />

import android.view.ViewGroup;<br />

import android.widget.LinearLayout;<br />

import android.widget.TextView;<br />

public class TypefaceStudy extends Activity {<br />

/** Called when the activity is first created. */<br />

/*<br />

* android.graphics.Typeface java.lang.Object<br />

Typeface 类 指 定 一 个 字 体 的 字 体 和 固 有 风 格 .<br />

* 该 类 用 于 绘 制 , 与 可 选 绘 制 设 置 一 起 使 用 ,<br />

如 textSize, textSkewX, textScaleX 当 绘 制 ( 测 量 ) 时 来 指 定 如 何 显 示 文 本 .<br />

*/<br />

/* 定 义 实 例 化 一 个 布 局 大 小 , 用 来 添 加 TextView */<br />

final int WRAP_CONTENT = ViewGroup.LayoutParams.WRAP_CONTENT;<br />

/* 定 义 TextView 对 象 */<br />

private TextView bold_TV, bold_italic_TV, default_TV,<br />

default_bold_TV,italic_TV,monospace_TV,<br />

normal_TV,sans_serif_TV,serif_TV;<br />

/* 定 义 LinearLayout 布 局 对 象 */<br />

private LinearLayout linearLayout;<br />

/* 定 义 LinearLayout 布 局 参 数 对 象 */<br />

private LinearLayout.LayoutParams linearLayouttParams;<br />

@Override<br />

public void onCreate(Bundle icicle) {<br />

super.onCreate(icicle);<br />

/* 定 义 实 例 化 一 个 LinearLayout 对 象 */<br />

linearLayout = new LinearLayout(this<br />

this);<br />

/* 设 置 LinearLayout 布 局 为 垂 直 布 局 */<br />

linearLayout.setOrientation(LinearLayout.VERTICAL);<br />

/* 设 置 布 局 背 景 图 */<br />

linearLayout.setBackgroundResource(R.drawable.back);<br />

/* 加 载 LinearLayout 为 主 屏 布 局 , 显 示 */<br />

setContentView(linearLayout);<br />

8


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

/* 定 义 实 例 化 一 个 LinearLayout 布 局 参 数 */<br />

linearLayouttParams =<br />

new LinearLayout.LayoutParams(WRAP_CONTENT,WRAP_CONTENT);<br />

constructTextView();<br />

setTextSizeOf();<br />

setTextViewText() ;<br />

setStyleOfFont();<br />

setFontColor();<br />

toAddTextViewToLayout();<br />

}<br />

public void constructTextView() {<br />

/* 实 例 化 TextView 对 象 */<br />

bold_TV = new TextView(this<br />

this);<br />

bold_italic_TV = new TextView(this<br />

this);<br />

default_TV = new TextView(this<br />

this);<br />

default_bold_TV = new TextView(this<br />

this);<br />

italic_TV = new TextView(this<br />

this);<br />

monospace_TV=new<br />

new TextView(this<br />

this);<br />

normal_TV=new<br />

new TextView(this<br />

this);<br />

sans_serif_TV=new<br />

new TextView(this<br />

this);<br />

serif_TV=new<br />

TextView(this<br />

this);<br />

}<br />

public void setTextSizeOf() {<br />

// 设 置 绘 制 的 文 本 大 小 , 该 值 必 须 大 于 0<br />

bold_TV.setTextSize(24.0f);<br />

bold_italic_TV.setTextSize(24.0f);<br />

default_TV.setTextSize(24.0f);<br />

default_bold_TV.setTextSize(24.0f);<br />

italic_TV.setTextSize(24.0f);<br />

monospace_TV.setTextSize(24.0f);<br />

normal_TV.setTextSize(24.0f);<br />

sans_serif_TV.setTextSize(24.0f);<br />

serif_TV.setTextSize(24.0f);<br />

}<br />

public void setTextViewText() {<br />

/* 设 置 文 本 */<br />

bold_TV.setText("BOLD");<br />

bold_italic_TV.setText("BOLD_ITALIC");<br />

default_TV.setText("DEFAULT");<br />

default_bold_TV.setText("DEFAULT_BOLD");<br />

italic_TV.setText("ITALIC");<br />

monospace_TV.setText("MONOSPACE");<br />

normal_TV.setText("NORMAL");<br />

sans_serif_TV.setText("SANS_SERIF");<br />

9


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

}<br />

serif_TV.setText("SERIF");<br />

}<br />

public void setStyleOfFont() {<br />

/* 设 置 字 体 风 格 */<br />

bold_TV.setTypeface(null<br />

null, Typeface.BOLD);<br />

bold_italic_TV.setTypeface(null<br />

null, Typeface.BOLD_ITALIC);<br />

default_TV.setTypeface(Typeface.DEFAULT);<br />

default_bold_TV.setTypeface(Typeface.DEFAULT_BOLD);<br />

italic_TV.setTypeface(null<br />

null, Typeface.ITALIC);<br />

monospace_TV.setTypeface(Typeface.MONOSPACE);<br />

normal_TV.setTypeface(null<br />

null, Typeface.NORMAL);<br />

sans_serif_TV.setTypeface(Typeface.SANS_SERIF);<br />

serif_TV.setTypeface(Typeface.SERIF);<br />

}<br />

public void setFontColor() {<br />

/* 设 置 文 本 颜 色 */<br />

bold_TV.setTextColor(Color.BLACK);<br />

bold_italic_TV.setTextColor(Color.CYAN);<br />

default_TV.setTextColor(Color.GREEN);<br />

default_bold_TV.setTextColor(Color.MAGENTA);<br />

italic_TV.setTextColor(Color.RED);<br />

monospace_TV.setTextColor(Color.WHITE);<br />

normal_TV.setTextColor(Color.YELLOW);<br />

sans_serif_TV.setTextColor(Color.GRAY);<br />

serif_TV.setTextColor(Color.LTGRAY);<br />

}<br />

public void toAddTextViewToLayout() {<br />

}<br />

/* 把 TextView 加 入 LinearLayout 布 局 中 */<br />

linearLayout.addView(bold_TV, linearLayouttParams);<br />

linearLayout.addView(bold_italic_TV, linearLayouttParams);<br />

linearLayout.addView(default_TV, linearLayouttParams);<br />

linearLayout.addView(default_bold_TV, linearLayouttParams);<br />

linearLayout.addView(italic_TV, linearLayouttParams);<br />

linearLayout.addView(monospace_TV, linearLayouttParams);<br />

linearLayout.addView(normal_TV, linearLayouttParams);<br />

linearLayout.addView(sans_serif_TV, linearLayouttParams);<br />

linearLayout.addView(serif_TV, linearLayouttParams);<br />

10


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

3<br />

结 果<br />

11


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

更 改 手 机 窗 口 画 面 底 色<br />

drawable 定 义 颜 色 常 数 的 方 法<br />

1 编 写 main 布 局<br />

<br />

<br />

android:id="@+id/widget0"<br />

android:layout_width="fill_parent"<br />

android:layout_height="fill_parent"<br />

xmlns:android="http://schemas.android.com/apk/res/android"<br />

<br />

android:id="@+id/name"<br />

android:layout_width="wrap_content"<br />

android:layout_height="wrap_content"<br />

android:text=" 账 号 "<br />

android:layout_x="61px"<br />

android:layout_y="69px"<br />

<br />

<br />

android:id="@+id/password"<br />

android:layout_width="wrap_content"<br />

android:layout_height="wrap_content"<br />

android:text=" 密 码 "<br />

android:layout_x="61px"<br />

android:layout_y="158px"<br />

<br />

<br />

android:id="@+id/name_in"<br />

android:layout_width="120dip"<br />

android:layout_height="wrap_content"<br />

android:textSize="18sp"<br />

android:layout_x="114px"<br />

android:layout_y="57px"<br />

<br />


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

android:textSize="18sp"<br />

android:password="true"<br />

android:layout_x="112px"<br />

android:layout_y="142px"<br />

><br />

<br />

<br />

2 在 values 文 件 夹 中 定 义 一 个 drawable.xml 文 件 用 来 存 放 颜 色 值<br />

<br />

<br />

#FFFFFF<br />

#938192<br />

#7cd12e<br />

<br />

3 修 改 main.xml 中 的 屏 幕 背 景 颜 色 和 TextView 的 字 体 颜 色<br />

<br />

android:id="@+id/widget0"<br />

android:layout_width="fill_parent"<br />

android:layout_height="fill_parent"<br />

android:background="@color/white"<br />

xmlns:android="http://schemas.android.com/apk/res/android"<br />

<br />

android:id="@+id/name"<br />

android:layout_width="wrap_content"<br />

android:layout_height="wrap_content"<br />

android:text=" 账 号 "<br />

android:textColor="@color/darkgray"<br />

android:layout_x="61px"<br />

android:layout_y="69px"<br />

<br />

<br />

android:id="@+id/password"<br />

android:layout_width="wrap_content"<br />

android:layout_height="wrap_content"<br />

android:text=" 密 码 "<br />

android:textColor="@color/darkgray"<br />

android:layout_x="61px"<br />

android:layout_y="158px"<br />

13


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

4 在 mainActivity.java 代 码 中 修 改 TextView 背 景 颜 色<br />

public void onCreate(Bundle savedInstanceState) {<br />

super.onCreate(savedInstanceState);<br />

setContentView(R.layout.main);<br />

TextView text=(TextView)findViewById(R.id.name);<br />

// 由 ID 获 得 资 源<br />

Resources myColor=getBaseContext().getResources();<br />

//getBaseContext() 获 得 基 础 Context<br />

//getResources() 获 得 资 源<br />

Drawable color_M=myColor.getDrawable(R.color.lightgreen);<br />

// 由 资 源 myColor 来 获 得 Drawable R.color.lightgreen 是 颜 色 值 的 ID 引 用<br />

}<br />

text.setBackgroundDrawable(color_M);<br />

// 设 置 背 景<br />

5 结 果 :<br />

14


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

代 码 中 更 改 TextView 文 字 颜 色<br />

1<br />

创 建 工 程<br />

2 编 写 布 局 main.xml<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

3 新 加 drawable.xml, 其 中 添 加 一 个 white 颜 色 值<br />

<br />

<br />

#ffffffff<br />

<br />

4<br />

在 代 码 中 由 ID 获 取 TextView<br />

TextView text_A=(TextView)findViewById(R.id.TextView01);<br />

TextView text_B=(TextView)findViewById(R.id.TextView02);<br />

5 获 取 Resources 对 象<br />

Resources myColor_R=getBaseContext().getResources();<br />

//getBaseContext() 获 得 基 础 Context<br />

//getResources() 从 Context 获 取 资 源 实 例 对 象<br />

15


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

6 获 取 Drawable 对 象<br />

Drawable myColor_D=myColor_R.getDrawable(R.color.white);<br />

7 设 置 文 本 背 景 颜 色<br />

text_A.setBackgroundDrawable(myColor_D);<br />

8 利 用 android.graphics.Color 的 颜 色 静 态 变 量 来 改 变 文 本 颜 色<br />

text_A.setTextColor(android.graphics.Color.GREEN);<br />

9 利 用 Color 的 静 态 常 量 来 设 置 文 本 颜 色<br />

text_B.setTextColor(Color.RED);<br />

16


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

置 换 TextView 文 字<br />

CharSequence 数 据 类 型 与 Resource ID 应 用<br />

1<br />

创 建 新 工 程<br />

2 修 改 main.xml 布 局 , 新 增 一 个 TextView<br />

<br />

<br />

<br />

<br />

3 在 string.xml 中 添 加 字 符 串 str_2:<br />

<br />

<br />

Hello World, Ex4_UI!<br />

Ex4_UI<br />

我 是 Resource 里 的 &quot; 字 符 串 &quot;<br />

<br />

4 在 mainActivity.java 中 findViewByID() 获 取 TextView<br />

TextView myText=(TextView)findViewById(R.id.myTextView2);<br />

5 getString(R.string.str_2) 得 到 原 字 符 串<br />

CharSequence string2=getString(R.string.str_2);<br />

6<br />

定 义 新 字 符 串 str_3<br />

String str_3=" 我 是 程 序 里 调 用 Resource 的 ";<br />

7 两 个 字 符 串 连 接 并 重 新 设 置 TextView 内 容<br />

myText.setText(str_3+string2);<br />

17


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

取 得 手 机 屏 幕 大 小<br />

DisplayMetrics 类 取 得 画 面 宽 高<br />

1<br />

创 建 新 工 程<br />

2 修 改 main.xml 布 局 , 添 加 一 个 TextView<br />

<br />

<br />

<br />

<br />

3<br />

在 代 码 中 定 义 一 个 DisplayMetrics 类 对 象<br />

DisplayMetrics displaysMetrics=new<br />

DisplayMetrics();<br />

//DisplayMetrics 一 个 描 述 普 通 显 示 信 息 的 结 构 , 例 如 显 示 大 小 、 密 度 、 字 体 尺 寸<br />

4<br />

获 取 手 机 窗 口 的 Display 来 初 始 化 DisplayMetrics 对 象<br />

getWindowManager().getDefaultDisplay().getMetrics(displaysMetrics);<br />

//getManager() 获 取 显 示 定 制 窗 口 的 管 理 器 。<br />

// 获 取 默 认 显 示 Display 对 象<br />

// 通 过 Display 对 象 的 数 据 来 初 始 化 一 个 DisplayMetrics 对 象<br />

5<br />

得 到 屏 幕 宽 高<br />

String showSize=" 手 机 屏 幕 分 辨 率 : \n"+<br />

displaysMetrics.widthPixels+"*"+displaysMetrics.heightPixels;<br />

6<br />

在 mainActivity.java 中 findViewByID() 获 取 TextView<br />

TextView myShow=(TextView)findViewById(R.id.TextView01);<br />

7<br />

显 示 屏 幕 分 辨 率 信 息<br />

myShow.setText(showSize);<br />

18


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

封 面<br />

19


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

封 面<br />

1


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

<strong>Android</strong> 基 础 UI 编 程 2<br />

标 题 、 状 态 栏 的 隐 藏<br />

标 题 栏 隐 藏<br />

在 Activity.setCurrentView(); 之 前 调 用 此 方 法<br />

private void HideTitle() {<br />

// TODO Auto-generated method stub<br />

requestWindowFeature(Window.FEATURE_NO_TITLE);<br />

}<br />

状 态 栏 隐 藏 ( 全 屏 )<br />

在 Activity.setCurrentView(); 之 前 调 用 此 方 法<br />

private void HideStatusBar() {<br />

// TODO Auto-generated method stub<br />

}<br />

// 隐 藏 标 题<br />

requestWindowFeature(Window.FEATURE_NO_TITLE);<br />

// 定 义 全 屏 参 数<br />

int flag=WindowManager.LayoutParams.FLAG_FULLSCREEN;<br />

// 获 得 窗 口 对 象<br />

Window myWindow=this<br />

this.getWindow();<br />

// 设 置 Flag 标 识<br />

myWindow.setFlags(flag,flag);<br />

2


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

样 式 化 的 定 型 对 象<br />

Style 样 式 的 定 义<br />

1<br />

新 建 工 程<br />

2 定 义 一 个 style.xml 存 放 样 式<br />

<br />

<br />

<br />

25sp<br />

#80FF00<br />

<br />

<br />

18sp<br />

#0C688E<br />

0.0<br />

0.0<br />

<br />

<br />

3 在 string.xml 中 添 加 字 符 串<br />

<br />

<br />

应 用 myStyle_Text1<br />

应 用 myStyle_Text2<br />

<br />

4 修 改 布 局 main.xml, 添 加 两 个 TextView<br />

<br />

<br />

3


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

5 加 入 Style<br />

<br />

<br />

<br />

<br />

<br />

6 结 果 :<br />

4


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

简 易 的 按 钮 事 件<br />

Button 事 件 处 理<br />

1<br />

创 建 新 工 程<br />

2 修 改 main.xml 布 局 , 添 加 一 个 TextView 和 一 个 Button<br />

<br />

<br />

<br />

<br />

<br />

3<br />

在 mainActivity.java 中 findViewByID() 获 取 TextView 和 Button 资 源<br />

show= (TextView)findViewById(R.id.show_TextView);<br />

press=(Button)findViewById(R.id.Click_Button);<br />

4<br />

给 Button 添 加 事 件 监 听 器 Button.OnClickListener()<br />

press.setOnClickListener(new<br />

new Button.OnClickListener(){<br />

@Override<br />

public void onClick(View v) {<br />

// TODO Auto-generated method stub<br />

}<br />

});<br />

5


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

5<br />

处 理 事 件<br />

press.setOnClickListener(new<br />

new Button.OnClickListener(){<br />

@Override<br />

public void onClick(View v) {<br />

// TODO Auto-generated method stub<br />

show.setText("Hi , Google <strong>Android</strong>!");<br />

}<br />

});<br />

6 结 果 :<br />

6


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

手 机 页 面 的 转 换<br />

setContentView 的 应 用<br />

1<br />

新 建 工 程<br />

2 string 添 加 两 个 提 示 字 符 串<br />

<br />

<br />

this is Layout 1<br />

This is Layout 2<br />

Ex8_UI<br />

<br />

3 新 建 color.xml 保 存 两 个 颜 色 值<br />

<br />

<br />

#000000<br />

#FFFFFFFF<br />

<br />

4 修 改 main.xml 布 局 , 添 加 一 个 TextView 和 一 个 Button<br />

<br />

<br />

<br />


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

android:layout_y="82px"<br />

android:text="Go to Layout2"<br />

><br />

<br />

5 新 建 mylayout.xml 布 局 文 件 , 并 添 加 两 个 View:TextView 和 Button<br />

<br />

<br />

<br />

<br />

<br />

<br />

6 编 写 mainActivity.java<br />

package zyf.Ex8_UI;<br />

import android.app.Activity;/* import 相 关 class */<br />

import android.os.Bundle;<br />

import android.view.View;<br />

import android.widget.Button;<br />

public class Ex8_UI extends Activity {<br />

/** Called when the activity is first created. */<br />

@Override<br />

public void onCreate(Bundle savedInstanceState) {<br />

8


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

}<br />

}<br />

super.onCreate(savedInstanceState);<br />

/* 载 入 main.xml Layout */<br />

setContentView(R.layout.main);// 默 认 启 动 布 局<br />

/* 以 findViewById() 取 得 Button 对 象 , 并 添 加 onClickListener */<br />

Button b1 = (Button) findViewById(R.id.button1);<br />

b1.setOnClickListener(new<br />

new Button.OnClickListener() {<br />

public void onClick(View v) {<br />

});<br />

}<br />

jumpToLayout2();// 调 用 跳 转 方 法 jumpToLayout2()<br />

/* method jumpToLayout2: 将 layout 由 main.xml 切 换 成 mylayout.xml */<br />

public void jumpToLayout2() {<br />

}<br />

/* 将 layout 改 成 mylayout.xml */<br />

setContentView(R.layout.mylayout);<br />

/* 以 findViewById() 取 得 Button 对 象 , 并 添 加 onClickListener */<br />

Button b2 = (Button) findViewById(R.id.button2);<br />

b2.setOnClickListener(new<br />

new Button.OnClickListener() {<br />

public void onClick(View v) {<br />

});<br />

}<br />

jumpToLayout1();// 调 用 跳 转 方 法 jumpToLayout1()<br />

/* method jumpToLayout1: 将 layout 由 mylayout.xml 切 换 成 main.xml */<br />

public void jumpToLayout1() {<br />

}<br />

/* 将 layout 改 成 main.xml */<br />

setContentView(R.layout.main);<br />

/* 以 findViewById() 取 得 Button 对 象 , 并 添 加 onClickListener */<br />

Button b1 = (Button) findViewById(R.id.button1);<br />

b1.setOnClickListener(new<br />

new Button.OnClickListener() {<br />

public void onClick(View v) {<br />

});<br />

}<br />

jumpToLayout2();// 调 用 跳 转 方 法 jumpToLayout2()<br />

7<br />

结 果<br />

9


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

调 用 另 一 个 Activity<br />

Intent 对 象 的 使 用<br />

1<br />

新 建 工 程<br />

2 在 string.xml 中 添 加 两 个 字 符 串<br />

<br />

<br />

Hello World, Ex9_UI!<br />

Ex9_UI<br />

This is Activity 1!<br />

This is Activity 2!<br />

<br />

3 新 建 color.xml 存 放 颜 色 值<br />

<br />

<br />

#000000<br />

#FFFFFFFF<br />

<br />

4 修 改 main.xml 布 局 , 添 加 一 个 TextView 和 一 个 Button<br />

<br />

<br />

<br />


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

android:layout_x="100px"<br />

android:layout_y="82px"<br />

android:text="Go to Activity2"<br />

><br />

<br />

5 新 建 一 个 secondlayout.xml 布 局 , 并 添 加 一 个 TextView 和 一 个 Button<br />

<br />

<br />

<br />

<br />

<br />

6 新 建 SecondActivity.java 文 件 , 添 加 内 容<br />

package zyf.Ex9_UI;<br />

import android.app.Activity;<br />

import android.content.Intent;<br />

import android.os.Bundle;<br />

import android.view.View;<br />

import android.widget.Button;<br />

public class SecondActivity extends Activity {<br />

11


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

}<br />

/** Called when the activity is first created. */<br />

@Override<br />

public void onCreate(Bundle savedInstanceState) {<br />

super.onCreate(savedInstanceState);<br />

}<br />

/* 载 入 mylayout.xml Layout */<br />

setContentView(R.layout.mylayout);<br />

/* 以 findViewById() 取 得 Button 对 象 , 并 添 加 onClickListener */<br />

Button b2 = (Button) findViewById(R.id.button2);<br />

b2.setOnClickListener(new<br />

new Button.OnClickListener() {<br />

public void onClick(View v) {<br />

});<br />

}<br />

/* new 一 个 Intent 对 象 , 并 指 定 要 启 动 的 class */<br />

Intent intent = new Intent();<br />

intent.setClass(SecondActivity.this<br />

this, Ex9_UI.class<br />

class);<br />

/* 调 用 一 个 新 的 Activity */<br />

startActivity(intent);<br />

/* 关 闭 原 本 的 Activity */<br />

SecondActivity.this<br />

this.finish();<br />

7 修 改 mainActivity.java, 添 加 代 码<br />

package zyf.Ex9_UI;<br />

import android.app.Activity;<br />

import android.content.Intent;<br />

import android.os.Bundle;<br />

import android.view.View;<br />

import android.widget.Button;<br />

public class Ex9_UI extends Activity {<br />

/** Called when the activity is first created. */<br />

@Override<br />

public void onCreate(Bundle savedInstanceState) {<br />

super.onCreate(savedInstanceState);<br />

/* 载 入 main.xml Layout */<br />

setContentView(R.layout.main);<br />

/* 以 findViewById() 取 得 Button 对 象 , 并 添 加 onClickListener */<br />

Button b1 = (Button) findViewById(R.id.button1);<br />

b1.setOnClickListener(new<br />

new Button.OnClickListener() {<br />

public void onClick(View v) {<br />

/* new 一 个 Intent 对 象 , 并 指 定 要 启 动 的 class */<br />

Intent intent = new Intent();<br />

12


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

}<br />

}<br />

});<br />

}<br />

intent.setClass(Ex9_UI.this<br />

this, SecondActivity.class<br />

class);<br />

/* 调 用 一 个 新 的 Activity */<br />

startActivity(intent);<br />

/* 关 闭 原 本 的 Activity */<br />

Ex9_UI.this<br />

this.finish();<br />

8 在 <strong>Android</strong>Manifest.xml 文 件 中 添 加 SecondActivity<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

9<br />

结 果<br />

13


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

不 同 Activity 之 间 的 数 据 传 递<br />

Bundle 对 象 的 实 现<br />

1<br />

新 建 工 程<br />

2 修 改 main.xml 布 局 , 添 加 UI 元 素<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

android:layout_x="124px"<br />

android:layout_y="101px"><br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

3 新 建 mylayout.xml, 并 添 加 UI 元 素<br />

<br />

<br />


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

android:layout_width="wrap_content"<br />

android:layout_height="wrap_content"<br />

android:textSize="20sp"<br />

android:layout_x="50px"<br />

android:layout_y="72px"<br />

><br />

<br />

4 新 建 一 个 BMIActivity.java<br />

package zyf.Ex10_UI;<br />

import android.app.Activity;<br />

import android.os.Bundle;<br />

public class BMIActivity extends Activity {<br />

/** Called when the activity is first created. */<br />

@Override<br />

public void onCreate(Bundle savedInstanceState) {<br />

super.onCreate(savedInstanceState);<br />

}<br />

}<br />

5 在 <strong>Android</strong>Manifest.xml 添 加 Activity 定 义<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

16


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

6 修 改 BMIActivity.java 内 容<br />

package zyf.Ex10_UI;<br />

/* import 相 关 class */<br />

import java.text.DecimalFormat;<br />

import java.text.NumberFormat;<br />

import android.app.Activity;<br />

import android.os.Bundle;<br />

import android.widget.TextView;<br />

public class BMIActivity extends Activity {<br />

/** Called when the activity is first created. */<br />

@Override<br />

public void onCreate(Bundle savedInstanceState) {<br />

super.onCreate(savedInstanceState);<br />

}<br />

/* 加 载 main.xml Layout */<br />

setContentView(R.layout.mylayout);<br />

/* 取 得 Intent 中 的 Bundle 对 象 */<br />

Bundle bunde = this.getIntent().getExtras();<br />

/* 取 得 Bundle 对 象 中 的 数 据 */<br />

String sex = bunde.getString("sex");<br />

double height = bunde.getDouble("height");<br />

/* 判 断 性 别 */<br />

String sexText = "";<br />

if (sex.equals("M")) {<br />

sexText = " 男 性 ";<br />

} else {<br />

}<br />

sexText = " 女 性 ";<br />

/* 取 得 标 准 体 重 */<br />

String weight = this.getWeight(sex, height);<br />

/* 设 置 输 出 文 字 */<br />

TextView tv1 = (TextView) findViewById(R.id.text1);<br />

tv1.setText(" 你 是 一 位 " + sexText + "\n 你 的 身 高 是 " + height +<br />

" 厘 米 \n 你 的 标 准 体 重 是 "+ weight + " 公 斤 ");<br />

/* 四 舍 五 入 的 method */<br />

private String format(double<br />

num) {<br />

NumberFormat formatter = new DecimalFormat("0.00");<br />

String s = formatter.format(num);<br />

return s;<br />

}<br />

17


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

}<br />

/* 以 findViewById() 取 得 Button 对 象 , 并 添 加 onClickListener */<br />

private String getWeight(String sex, double height) {<br />

String weight = "";<br />

if (sex.equals("M")) {<br />

weight = format((height - 80) * 0.7);<br />

} else {<br />

weight = format((height - 70) * 0.6);<br />

}<br />

return weight;<br />

}<br />

7 修 改 mainActivity.java 内 容<br />

package zyf.Ex10_UI;<br />

/* import 相 关 class */<br />

import android.app.Activity;<br />

import android.content.Intent;<br />

import android.os.Bundle;<br />

import android.view.View;<br />

import android.widget.Button;<br />

import android.widget.EditText;<br />

import android.widget.RadioButton;<br />

public class Ex10_UI extends Activity {<br />

/** Called when the activity is first created. */<br />

@Override<br />

public void onCreate(Bundle savedInstanceState) {<br />

super.onCreate(savedInstanceState);<br />

/* 载 入 main.xml Layout */<br />

setContentView(R.layout.main);<br />

/* 以 findViewById() 取 得 Button 对 象 , 并 添 加 onClickListener */<br />

Button ok = (Button) findViewById(R.id.button_OK);<br />

ok.setOnClickListener(new<br />

new Button.OnClickListener() {<br />

public void onClick(View v) {<br />

/* 取 得 输 入 的 身 高 */<br />

EditText et = (EditText) findViewById(R.id.height_Edit);<br />

double height = Double.parseDouble(et.getText().toString());<br />

/* 取 得 选 择 的 性 别 */<br />

String sex = "";<br />

RadioButton rb1 = (RadioButton) findViewById(R.id.Sex_Man);<br />

if (rb1.isChecked()) {<br />

sex = "M";<br />

} else {<br />

18


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

}<br />

}<br />

});<br />

}<br />

}<br />

sex = "F";<br />

/* new 一 个 Intent 对 象 , 并 指 定 class */<br />

Intent intent = new Intent();<br />

intent.setClass(Ex10_UI.this<br />

this, BMIActivity.class<br />

class);<br />

/* new 一 个 Bundle 对 象 , 并 将 要 传 递 的 数 据 传 入 */<br />

Bundle bundle = new Bundle();<br />

bundle.putDouble("height", height);<br />

bundle.putString("sex", sex);<br />

/* 将 Bundle 对 象 assign 给 Intent */<br />

intent.putExtras(bundle);<br />

/* 调 用 Activity EX03_10_1 */<br />

startActivity(intent);<br />

8 结 果 :<br />

19


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

返 回 数 据 到 前 一 个 Activity<br />

startActivityForResult 方 法<br />

1<br />

新 建 工 程<br />

2 修 改 main.xml 布 局 , 添 加 UI 元 素<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

android:layout_x="124px"<br />

android:layout_y="101px"><br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

3 新 建 一 个 mylayout.xml 布 局 , 添 加 UI 元 素<br />

<br />

<br />


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

android:layout_width="wrap_content"<br />

android:layout_height="wrap_content"<br />

android:textSize="20sp"<br />

android:layout_x="50px"<br />

android:layout_y="72px"<br />

><br />

<br />

<br />

上 一 例 子 中 新 添 加<br />

4 新 建 一 个 SecondActivity.java 的 Activity 子 类<br />

package zyf.Ex11_UI_A;<br />

import android.app.Activity;<br />

import android.os.Bundle;<br />

public class BMIActivity extends Activity {<br />

/** Called when the activity is first created. */<br />

@Override<br />

public void onCreate(Bundle savedInstanceState) {<br />

super.onCreate(savedInstanceState);<br />

}<br />

}<br />

5 在 <strong>Android</strong>Manifest.xml 中 添 加 SecondActivity 这 个 Activity<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

22


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

<br />

<br />

<br />

必 须 在 <strong>Android</strong>Manifest 中 注 册 新 的<br />

<br />

Activity, 否 则 程 序 出 错<br />

<br />

6 修 改 mainActivity.java 代 码<br />

package zyf.Ex11_UI_A;<br />

import android.app.Activity;/* import 相 关 class */<br />

import android.content.Intent;<br />

import android.os.Bundle;<br />

import android.view.View;<br />

import android.widget.Button;<br />

import android.widget.EditText;<br />

import android.widget.RadioButton;<br />

import android.widget.Toast;<br />

public class Ex11_UI_A extends Activity {<br />

protected int my_requestCode = 1550;<br />

private EditText edit_height;<br />

private RadioButton radiobutton_Man, radiobutton_Woman;<br />

/** Called when the activity is first created. */<br />

@Override<br />

public void onCreate(Bundle savedInstanceState) {<br />

super.onCreate(savedInstanceState);<br />

/* 载 入 main.xml Layout */<br />

setContentView(R.layout.main);<br />

/* 以 findViewById() 取 得 Button 对 象 , 并 添 加 onClickListener */<br />

Button ok = (Button) findViewById(R.id.button_OK);<br />

edit_height = (EditText) findViewById(R.id.height_Edit);<br />

radiobutton_Man = (RadioButton) findViewById(R.id.Sex_Man);<br />

radiobutton_Woman = (RadioButton) findViewById(R.id.Sex_Woman);<br />

ok.setOnClickListener(new<br />

new Button.OnClickListener() {<br />

public void onClick(View v) {<br />

try {<br />

/* 取 得 输 入 的 身 高 */<br />

double height = Double.parseDouble(edit_height.getText()<br />

.toString());<br />

/* 取 得 选 择 的 性 别 */<br />

String sex = "";<br />

if (radiobutton_Man.isChecked()) {<br />

sex = "M";<br />

} else {<br />

}<br />

sex = "F";<br />

23


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

}<br />

}<br />

});<br />

}<br />

/* new 一 个 Intent 对 象 , 并 指 定 class */<br />

Intent intent = new Intent();<br />

intent.setClass(Ex11_UI_A.this<br />

this, BMIActivity.class<br />

class);<br />

/* new 一 个 Bundle 对 象 , 并 将 要 传 递 的 数 据 传 入 */<br />

Bundle bundle = new Bundle();<br />

bundle.putDouble("height", height);<br />

bundle.putString("sex", sex);<br />

/* 将 Bundle 对 象 assign 给 Intent */<br />

intent.putExtras(bundle);<br />

/* 调 用 Activity EX03_10_1 */<br />

startActivityForResult(intent, my_requestCode);<br />

} catch (Exception e) {<br />

// TODO: handle exception<br />

Toast.makeText(Ex11_UI_A.this<br />

this,<br />

}<br />

R.string.errorString, Toast.LENGTH_LONG).show();<br />

@Override<br />

protected void onActivityResult(int<br />

int requestCode, int resultCode,<br />

}<br />

Intent data) {<br />

// TODO Auto-generated method stub<br />

super.onActivityResult(requestCode, resultCode, data);<br />

switch (resultCode) {<br />

case RESULT_OK:<br />

/* 取 得 来 自 Activity2 的 数 据 , 并 显 示 于 画 面 上 */<br />

Bundle bunde = data.getExtras();<br />

String sex = bunde.getString("sex");<br />

double height = bunde.getDouble("height");<br />

edit_height.setText("" + height);<br />

if (sex.equals("M")) {<br />

radiobutton_Man.setChecked(true<br />

true);<br />

} else {<br />

radiobutton_Woman.setChecked(true<br />

true);<br />

}<br />

break;<br />

default:<br />

break;<br />

}<br />

新 重 写 方 法 , 等 待 返 回 结 果<br />

24


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

7 修 改 SecondActivity.java 代 码<br />

package zyf.Ex11_UI_A;<br />

/* import 相 关 class */<br />

import java.text.DecimalFormat;<br />

import java.text.NumberFormat;<br />

import android.app.Activity;<br />

import android.content.Intent;<br />

import android.os.Bundle;<br />

import android.view.View;<br />

import android.widget.Button;<br />

import android.widget.TextView;<br />

public class BMIActivity extends Activity {<br />

private Intent intent;<br />

private Bundle bunde;<br />

/** Called when the activity is first created. */<br />

@Override<br />

public void onCreate(Bundle savedInstanceState) {<br />

super.onCreate(savedInstanceState);<br />

/* 加 载 main.xml Layout */<br />

setContentView(R.layout.mylayout);<br />

/* 取 得 Intent 中 的 Bundle 对 象 */<br />

intent = this.getIntent();<br />

bunde = intent.getExtras();<br />

/* 取 得 Bundle 对 象 中 的 数 据 */<br />

String sex = bunde.getString("sex");<br />

double height = bunde.getDouble("height");<br />

/* 判 断 性 别 */<br />

String sexText = "";<br />

if (sex.equals("M")) {<br />

sexText = " 男 性 ";<br />

} else {<br />

}<br />

sexText = " 女 性 ";<br />

/* 取 得 标 准 体 重 */<br />

String weight = this.getWeight(sex, height);<br />

/* 设 置 输 出 文 字 */<br />

TextView tv1 = (TextView) findViewById(R.id.text1);<br />

tv1.setText(" 你 是 一 位 " + sexText + "\n 你 的 身 高 是 " + height +<br />

" 厘 米 \n 你 的 标 准 体 重 是 "+ weight + " 公 斤 ");<br />

25


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

/* 以 findViewById() 取 得 Button 对 象 , 并 添 加 onClickListener */<br />

Button b1 = (Button) findViewById(R.id.button_back);<br />

b1.setOnClickListener(new<br />

new Button.OnClickListener() {<br />

}<br />

@Override<br />

public void onClick(View v) {<br />

返 回 刚 刚 接 收 的 Intent<br />

// TODO Auto-generated method stub<br />

/* 返 回 result 回 上 一 个 activity */<br />

BMIActivity.this<br />

this.setResult(RESULT_OK, intent);<br />

/* 结 束 这 个 activity */<br />

BMIActivity.this<br />

this.finish();<br />

}<br />

});<br />

}<br />

/* 四 舍 五 入 的 method */<br />

private String format(double<br />

num) {<br />

NumberFormat formatter = new DecimalFormat("0.00");<br />

String s = formatter.format(num);<br />

return s;<br />

}<br />

/* 以 findViewById() 取 得 Button 对 象 , 并 添 加 onClickListener */<br />

private String getWeight(String sex, double height) {<br />

String weight = "";<br />

if (sex.equals("M")) {<br />

weight = format((height - 80) * 0.7);<br />

} else {<br />

weight = format((height - 70) * 0.6);<br />

}<br />

return weight;<br />

}<br />

8<br />

结 果<br />

26


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

封 面<br />

27


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

封 面<br />

1


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

<strong>Android</strong><br />

UI 编 程 基 础 3<br />

EditText 与 TextView 共 舞<br />

setOnKeyListener 事 件<br />

1<br />

新 建 工 程<br />

2 在 main.xml 布 局 中 添 加 UI 元 素 : 一 个 EditText 和 一 个 TextView<br />

<br />

<br />

<br />

<br />

<br />

<br />

3 在 mainActivity.java 主 Activity 中 修 改 代 码<br />

package zyf.EX_Ctrl_1;<br />

import android.app.Activity;<br />

import android.os.Bundle;<br />

import android.view.KeyEvent;<br />

import android.view.View;<br />

import android.widget.EditText;<br />

import android.widget.TextView;<br />

public class EX_Ctrl_1 extends Activity {<br />

private TextView mTextView01;<br />

2


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

private EditText mEditText01;<br />

/** Called when the activity is first created. */<br />

@Override<br />

public void onCreate(Bundle savedInstanceState) {<br />

super.onCreate(savedInstanceState);<br />

setContentView(R.layout.main);<br />

/* 取 得 TextView、EditText */<br />

mTextView01 = (TextView) findViewById(R.id.myTextView);<br />

mEditText01 = (EditText) findViewById(R.id.myEditText);<br />

处 理 EditText 键 入 事 件<br />

/* 设 置 EditText 用 OnKeyListener 事 件 来 启 动 */<br />

mEditText01.setOnKeyListener(new<br />

new EditText.OnKeyListener(){<br />

}<br />

}<br />

@Override<br />

public boolean onKey(View v, int keyCode, KeyEvent event) {<br />

// TODO Auto-generated method stub<br />

mTextView01.setText(mEditText01.getText().toString());<br />

return false;<br />

}<br />

});<br />

4<br />

结 果<br />

3


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

设 计 具 有 背 景 图 的 按 钮<br />

ImageButton 的 焦 点 及 事 件 处 理<br />

1<br />

新 建 工 程<br />

2<br />

准 备 png 图 片 资 源 clickimage.png、lostfocusimage.png、onfocusimage.png<br />

3 在 string.xml 中 添 加 字 符 串<br />

<br />

<br />

EX_Ctrl_2<br />

图 片 按 钮 状 态 : 未 知 <br />

图 片 按 钮 状 态 :Got Focus<br />

图 片 按 钮 状 态 :Lost Focus<br />

图 片 按 钮 状 态 :Got Click<br />

一 般 按 钮 <br />

<br />

4 修 改 main.xml 布 局 , 添 加 布 局 元 素<br />

<br />

<br />

<br />


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

android:layout_width="wrap_content"<br />

android:layout_height="wrap_content"<br />

/><br />

<br />

<br />

5 修 改 mainActivity.java<br />

package zyf.EX_Ctrl_2;<br />

import android.app.Activity;<br />

import android.os.Bundle;<br />

import android.view.View;<br />

import android.view.View.OnClickListener;<br />

import android.view.View.OnFocusChangeListener;<br />

import android.widget.Button;<br />

import android.widget.ImageButton;<br />

import android.widget.TextView;<br />

public class EX_Ctrl_2 extends Activity {<br />

/** Called when the activity is first created. */<br />

/* 声 明 三 个 对 象 变 量 ( 图 片 按 钮 , 按 钮 , 与 TextView) */<br />

private ImageButton mImageButton1;<br />

private Button mButton1;<br />

private TextView mTextView1;<br />

@Override<br />

public void onCreate(Bundle savedInstanceState) {<br />

super.onCreate(savedInstanceState);<br />

setContentView(R.layout.main);<br />

/* 通 过 findViewById 构 造 三 个 对 象 */<br />

mImageButton1 = (ImageButton) findViewById(R.id.image_Button);<br />

mButton1 = (Button) findViewById(R.id.normal_Button);<br />

mTextView1 = (TextView) findViewById(R.id.show_TextView);<br />

/* 通 过 OnFocusChangeListener 来 响 应 ImageButton 的 onFous 事 件 */<br />

mImageButton1.setOnFocusChangeListener(new<br />

new OnFocusChangeListener() {<br />

public void onFocusChange(View arg0, boolean isFocused) {<br />

// TODO Auto-generated method stub<br />

/* 若 ImageButton 状 态 为 onFocus 改 变 ImageButton 的 图 片<br />

并 改 变 textView 的 文 字 */<br />

if (isFocused == true) {<br />

mTextView1.setText(R.string.onfocus);<br />

mImageButton1.setImageResource(R.drawable.onfocusimage);<br />

5


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

});<br />

}<br />

}<br />

/* 若 ImageButton 状 态 为 offFocus 改 变 ImageButton 的 图 片<br />

并 改 变 textView 的 文 字 */<br />

else {<br />

}<br />

mTextView1.setText(R.string.lostfocus);<br />

mImageButton1.setImageResource(R.drawable.lostfocusimage);<br />

/* 通 过 onClickListener 来 响 应 ImageButton 的 onClick 事 件 */<br />

mImageButton1.setOnClickListener(new<br />

new OnClickListener() {<br />

public void onClick(View v){<br />

// TODO Auto-generated method stub<br />

});<br />

}<br />

/* 若 ImageButton 状 态 为 onClick 改 变 ImageButton 的 图 片<br />

并 改 变 textView 的 文 字 */<br />

mTextView1.setText(R.string.onclick);<br />

mImageButton1.setImageResource(R.drawable.clickimage);<br />

}<br />

}<br />

/* 通 过 onClickListener 来 响 应 Button 的 onClick 事 件 */<br />

mButton1.setOnClickListener(new<br />

new OnClickListener(){<br />

});<br />

@Override<br />

public void onClick(View v) {<br />

// TODO Auto-generated method stub<br />

}<br />

/* 若 Button 状 态 为 onClick 改 变 ImageButton 的 图 片<br />

* 并 改 变 textView 的 文 字 */<br />

mTextView1.setText(R.string.lostfocus);<br />

mImageButton1.setImageResource(R.drawable.lostfocusimage);<br />

6<br />

结 果<br />

6


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

使 用 XML 实 现 按 钮 改 变 焦 点 设 置 背 景 图<br />

Button 的 android:background 属 性<br />

设 置 按 钮 背 景 图 片 :<br />

‣ onFocus() 与 onClick() 事 件 处 理<br />

‣ Item 的 android:state_focused 和 android:state_pressed 属 性<br />

<br />

实 现<br />

1<br />

新 建 工 程<br />

2<br />

准 备 png 背 景 图 片 defaultimage.png 、onfocusimage.png、clickimage.png<br />

clickimage defaultimage.png onfocusimage.png<br />

3 在 main.xml 布 局 中 添 加 一 个 ImageButton 和 一 个 Button( 作 对 比 )<br />

<br />

<br />


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

4 在 drawable 文 件 夹 中 添 加 一 个 advancedbutton.xml 设 置 和 标 签<br />

<br />

<br />

<br />

<br />

<br />

默 认 时<br />

<br />

<br />

5 设 置 ImageButton 的 android:background 属 性 值<br />

<br />

利 用 XML 来 改 变 按 钮 背 景 图 片<br />

6<br />

结 果<br />

8


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

给 圣 诞 老 人 的 信 息<br />

Toast--<strong>Android</strong> 专 属 浮 动 小 提 示<br />

1<br />

新 建 工 程<br />

2 在 string.xml 中 添 加 字 符 串<br />

<br />

<br />

EX_Ctrl_3<br />

亲 爱 的 圣 诞 老 人 :<br />

送 出 愿 望 <br />

你 的 愿 望 :<br />

已 送 达 圣 诞 老 人 信 箱 !<br />

<br />

3 在 main.xml 布 局 中 添 加 UI 元 素 : 一 个 TextView、 一 个 EditView 和 一 个 Button<br />

<br />

<br />

<br />

<br />

<br />

<br />

9


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

4 修 改 mainActivity.java 文 件<br />

package zyf.EX_Ctrl_3;<br />

import android.app.Activity;<br />

import android.os.Bundle;<br />

import android.text.Editable;<br />

import android.view.View;<br />

import android.widget.Button;<br />

import android.widget.EditText;<br />

import android.widget.Toast;<br />

public class EX_Ctrl_3 extends Activity {<br />

/** Called when the activity is first created. */<br />

/* 声 明 两 个 对 象 变 量 ( 按 钮 与 编 辑 文 字 )*/<br />

private Button mButton;<br />

private EditText mEditText;<br />

@Override<br />

public void onCreate(Bundle savedInstanceState) {<br />

super.onCreate(savedInstanceState);<br />

setContentView(R.layout.main);<br />

/* 通 过 findViewById() 取 得 对 象 */<br />

mButton=(Button)findViewById(R.id.Button_Send);<br />

mEditText=(EditText)findViewById(R.id.EditText_Wish);<br />

/* 设 置 onClickListener 给 Button 对 象 聆 听 onClick 事 件 */<br />

mButton.setOnClickListener(new<br />

new Button.OnClickListener(){<br />

@Override<br />

public void onClick(View v) {<br />

// TODO Auto-generated method stub<br />

Toast.makeText(<br />

_LONG).show();<br />

}<br />

}<br />

});<br />

}<br />

/* 声 明 字 符 串 变 量 并 取 得 用 户 输 入 的 EditText 字 符 串 */<br />

Editable Str;<br />

Str=mEditText.getText();<br />

/* 使 用 CharSequence 类 getString() 方 法 从 XML 中 获 取 String*/<br />

CharSequence string2=getString(R.string.yourWish);<br />

CharSequence string3=getString(R.string.hasSend);<br />

/* 使 用 系 统 标 准 的 makeText() 方 式 来 产 生 Toast 信 息 */<br />

EX_Ctrl_3.this<br />

this,string2+Str.toString()+string3,Toast.LENGTH<br />

/* 清 空 EditText*/<br />

mEditText.setText("");<br />

10


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

5<br />

结 果<br />

11


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

Toast-- 显 示 View 的 提 示<br />

Toast 显 示 一 个 ImageView<br />

1<br />

新 建 工 程<br />

2<br />

在 drawable 文 件 夹 中 添 加 一 副 png 图 片 :argon.png<br />

3 修 改 mainActivity.java 文 件<br />

package zyf.EX_Ctrl_3_B;<br />

import android.app.Activity;<br />

import android.os.Bundle;<br />

import android.widget.ImageView;<br />

import android.widget.Toast;<br />

public class EX_Ctrl_3_B extends Activity {<br />

}<br />

/** Called when the activity is first created. */<br />

@Override<br />

public void onCreate(Bundle savedInstanceState) {<br />

super.onCreate(savedInstanceState);<br />

}<br />

/* 设 置 主 屏 布 局 */<br />

setContentView(R.layout.main);<br />

/* 创 建 新 Toast 对 象 */<br />

Toast showImageToast=new<br />

Toast(this<br />

this);<br />

/* 创 建 新 ImageView 对 象 */<br />

ImageView imageView=new<br />

ImageView(this<br />

this);<br />

/* 从 资 源 中 获 取 图 片 */<br />

imageView.setImageResource(R.drawable.argon);<br />

/* 设 置 Toast 上 的 View--(ImageView)*/<br />

showImageToast.setView(imageView);<br />

/* 设 置 Toast 显 示 时 间 */<br />

showImageToast.setDuration(Toast.LENGTH_LONG);<br />

/* 显 示 Toast*/<br />

showImageToast.show();<br />

12


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

4<br />

结 果<br />

13


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

Toast 显 示 一 个 Button<br />

1<br />

新 建 工 程<br />

2 修 改 mainActivity.java 文 件<br />

package zyf.EX_Ctrl_3_B;<br />

import android.app.Activity;<br />

import android.os.Bundle;<br />

import android.view.View;<br />

import android.widget.Button;<br />

import android.widget.Toast;<br />

public class EX_Ctrl_3_B extends Activity {<br />

}<br />

/** Called when the activity is first created. */<br />

@Override<br />

public void onCreate(Bundle savedInstanceState) {<br />

super.onCreate(savedInstanceState);<br />

}<br />

/* 设 置 主 屏 布 局 */<br />

setContentView(R.layout.main);<br />

/* 创 建 新 Toast 对 象 */<br />

Toast showImageToast = new Toast(this<br />

this);<br />

// /* 新 建 Button 对 象 */<br />

Button button = new Button(this<br />

this);<br />

button.setText("OK");<br />

/* 设 置 Toast 上 的 View--(Button) */<br />

showImageToast.setView(button);<br />

/* 设 置 Toast 显 示 时 间 */<br />

showImageToast.setDuration(Toast.LENGTH_LONG);<br />

/* 显 示 Toast */<br />

showImageToast.show();<br />

3<br />

结 果<br />

14


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

Toast 显 示 一 个 TextView<br />

1<br />

新 建 工 程<br />

2 修 改 mainActivity.java 文 件<br />

package zyf.EX_Ctrl_3_B;<br />

import android.app.Activity;<br />

import android.os.Bundle;<br />

import android.widget.TextView;<br />

import android.widget.Toast;<br />

public class EX_Ctrl_3_B extends Activity {<br />

}<br />

/** Called when the activity is first created. */<br />

@Override<br />

public void onCreate(Bundle savedInstanceState) {<br />

super.onCreate(savedInstanceState);<br />

}<br />

3<br />

/* 设 置 主 屏 布 局 */<br />

setContentView(R.layout.main);<br />

/* 创 建 新 Toast 对 象 */<br />

Toast showImageToast = new Toast(this<br />

this);<br />

/* 新 建 TextView 对 象 */<br />

TextView text=new<br />

TextView(this<br />

this);<br />

/* 设 置 TextView 内 容 */<br />

text.setText(" 显 示 在 Toast 中 的 TextView");<br />

/* 设 置 Toast 上 的 View--(TextView) */<br />

showImageToast.setView(text);<br />

/* 设 置 Toast 显 示 时 间 */<br />

showImageToast.setDuration(Toast.LENGTH_LONG);<br />

/* 显 示 Toast */<br />

showImageToast.show();<br />

结 果<br />

15


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

AlertDialog.Builder 提 示 对 话 框<br />

1<br />

新 建 工 程<br />

2 修 改 mainActivity.java 文 件<br />

package zyf.EX_Ctrl_3_B;<br />

import android.app.Activity;<br />

import android.app.AlertDialog;<br />

import android.os.Bundle;<br />

public class EX_Ctrl_3_B extends Activity {<br />

}<br />

/** Called when the activity is first created. */<br />

@Override<br />

public void onCreate(Bundle savedInstanceState) {<br />

super.onCreate(savedInstanceState);<br />

}<br />

/* 设 置 主 屏 布 局 */<br />

setContentView(R.layout.main);<br />

/* 新 建 一 个 AlertDialog.Builder 对 象 */<br />

AlertDialog.Builder my_ADialog =new<br />

AlertDialog.Builder(this<br />

this);<br />

/* 设 置 标 题 */<br />

my_ADialog.setTitle("<strong>Android</strong> 提 示 ");<br />

/* 设 置 显 示 消 息 */<br />

my_ADialog.setMessage("AlertDialog.Builder 提 示 对 话 框 消 息 !!");<br />

/* 显 示 */<br />

my_ADialog.show();<br />

3<br />

结 果<br />

16


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

同 意 条 款<br />

CheckBox 的 isChecked 属 性<br />

1<br />

创 建 新 工 程<br />

2 在 string.xml 中 添 加 字 符 串<br />

<br />

<br />

Ex_Ctrl_4<br />

请 勾 选 我 同 意 <br />

您 已 接 受 同 意 !!<br />

您 未 同 意 !!<br />

全 部 许 可 <br />

<br />

3 修 改 main.xml 布 局 , 添 加 UI 元 素<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

17


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

4 修 改 mainActivity.java 文 件<br />

package zyf.Ex_Ctrl_4;<br />

import android.app.Activity;<br />

import android.graphics.Color;<br />

import android.os.Bundle;<br />

import android.view.View;<br />

import android.widget.Button;<br />

import android.widget.CheckBox;<br />

import android.widget.TextView;<br />

public class Ex_Ctrl_4 extends Activity {<br />

/** Called when the activity is first created. */<br />

private TextView showAdvice,yourChoiceshow;<br />

private CheckBox iAccept;<br />

private Button ok;<br />

@Override<br />

public void onCreate(Bundle savedInstanceState) {<br />

super.onCreate(savedInstanceState);<br />

setContentView(R.layout.main);<br />

/*findViewById() 从 资 源 ID 获 取 资 源 对 象 */<br />

showAdvice=(TextView)findViewById(R.id.TextView_Guide);<br />

yourChoiceshow=(TextView)findViewById(R.id.TextView_youChoiceShow);<br />

iAccept=(CheckBox)findViewById(R.id.CheckBox_Accept);<br />

ok=(Button)findViewById(R.id.Button_OK);<br />

/* 获 取 XML 中 字 符 串 */<br />

CharSequence titleString=getString(R.string.allOK);<br />

/* 设 置 复 选 框 标 题 */<br />

iAccept.setHint(titleString);<br />

/* 设 置 复 选 框 标 题 字 体 颜 色 */<br />

iAccept.setHintTextColor(Color.RED);<br />

/* 将 CheckBox 设 置 成 未 选 中 */<br />

iAccept.setChecked(false<br />

false);<br />

/* 将 Button 设 置 成 不 可 选 */<br />

ok.setEnabled(false<br />

false);<br />

iAccept.setOnClickListener(new<br />

new CheckBox.OnClickListener(){<br />

@Override<br />

public void onClick(View v) {<br />

// TODO Auto-generated method stub<br />

if(iAccept.isChecked()){<br />

18


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

}<br />

ok.setEnabled(true<br />

true);<br />

yourChoiceshow.setText(R.string.accept);<br />

}else<br />

else{<br />

ok.setEnabled(false<br />

false);<br />

yourChoiceshow.setText(R.string.Notaccept);<br />

}<br />

});<br />

ok.setOnClickListener(new<br />

new Button.OnClickListener(){<br />

}<br />

}<br />

@Override<br />

public void onClick(View v) {<br />

// TODO Auto-generated method stub<br />

if(iAccept.isChecked()){<br />

showAdvice.setText(R.string.accept);<br />

}<br />

}<br />

});<br />

5<br />

结 果<br />

19


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

购 物 列 表<br />

多 选 项 CheckBox 的 应 用<br />

1<br />

新 建 工 程<br />

2 在 string.xml 中 添 加 字 符 串<br />

<br />

<br />

Ex_Ctrl_5<br />

网 上 购 物 商 品 清 单 <br />

您 选 择 购 买 的 商 品 :<br />

纽 曼 MP4<br />

Beyond 乐 队 CD<br />

<strong>Android</strong> 程 序 员 指 南 <br />

<br />

3 修 改 main.xml 布 局 , 添 加 UI 元 素<br />

<br />

<br />

<br />

<br />

<br />


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

android:id="@+id/CheckBox_book"<br />

android:layout_width="180px"><br />

<br />

<br />

<br />

4 修 改 mainActivity.java, 添 加 逻 辑 判 断<br />

package zyf.Ex_Ctrl_5;<br />

import android.app.Activity;<br />

import android.os.Bundle;<br />

import android.widget.CheckBox;<br />

import android.widget.CompoundButton;<br />

import android.widget.TextView;<br />

import android.widget.CompoundButton.OnCheckedChangeListener;<br />

public class Ex_Ctrl_5 extends Activity {<br />

/** Called when the activity is first created. */<br />

private TextView showyourChoice_TextView;<br />

private CheckBox mp4_CheckBox, musicCD_CheckBox, book_CheckBox;<br />

private String showinfo;<br />

@Override<br />

public void onCreate(Bundle savedInstanceState) {<br />

super.onCreate(savedInstanceState);<br />

setContentView(R.layout.main);<br />

/* findViewById() 从 XML 中 获 取 资 源 对 象 */<br />

showyourChoice_TextView = (TextView)<br />

findViewById(R.id.TextView_yourWoodsList);<br />

mp4_CheckBox = (CheckBox) findViewById(R.id.CheckBox_MP4);<br />

musicCD_CheckBox = (CheckBox) findViewById(R.id.CheckBox_musicCD);<br />

book_CheckBox = (CheckBox) findViewById(R.id.CheckBox_book);<br />

/* 为 三 个 CheckBox 设 置 选 择 状 态 改 变 事 件 监 听 器 */<br />

21


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

mp4_CheckBox.setOnCheckedChangeListener(CheckedChangeListener);<br />

musicCD_CheckBox.setOnCheckedChangeListener(CheckedChangeListener);<br />

book_CheckBox.setOnCheckedChangeListener(CheckedChangeListener);<br />

}<br />

/* 从 XML 中 获 取 显 示 信 息 String */<br />

showinfo = getString(R.string.yourChocieWoods_text);<br />

/* 内 部 接 口 实 现 */<br />

private OnCheckedChangeListener CheckedChangeListener = new<br />

OnCheckedChangeListener() {<br />

@Override<br />

public void onCheckedChanged(CompoundButton buttonView,<br />

boolean isChecked) {<br />

// TODO Auto-generated method stub<br />

/* 处 理 选 中 状 态 改 变 事 件 , 动 态 显 示 选 择 结 果 */<br />

if (mp4_CheckBox.isChecked()) {<br />

showinfo = getString(R.string.woods_Text_MP4) + "\n";<br />

showString();<br />

} else if (musicCD_CheckBox.isChecked()) {<br />

showinfo = getString(R.string.woods_Text_musicCD) + "\n";<br />

showString();<br />

} else if (book_CheckBox.isChecked()) {<br />

showinfo = getString(R.string.woods_Text_book) + "\n";<br />

showString();<br />

}<br />

if (mp4_CheckBox.isChecked() && musicCD_CheckBox.isChecked()) {<br />

showinfo = getString(R.string.woods_Text_MP4) + "\n"<br />

+ getString(R.string.woods_Text_musicCD) + "\n";<br />

showString();<br />

} else if (mp4_CheckBox.isChecked() && book_CheckBox.isChecked()) {<br />

showinfo = getString(R.string.woods_Text_MP4) + "\n"<br />

+ getString(R.string.woods_Text_book) + "\n";<br />

showString();<br />

} else if (musicCD_CheckBox.isChecked()<br />

&& book_CheckBox.isChecked()) {<br />

showinfo = getString(R.string.woods_Text_musicCD) + "\n"<br />

+ getString(R.string.woods_Text_book) + "\n";<br />

showString();<br />

}<br />

if (mp4_CheckBox.isChecked() && musicCD_CheckBox.isChecked()<br />

&& book_CheckBox.isChecked()) {<br />

showinfo = getString(R.string.woods_Text_MP4) + "\n"<br />

22


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

}<br />

+ getString(R.string.woods_Text_musicCD) + "\n"<br />

+ getString(R.string.woods_Text_book) + "\n";<br />

showString();<br />

}<br />

if (mp4_CheckBox.isChecked() == false<br />

&& musicCD_CheckBox.isChecked() == false<br />

&& book_CheckBox.isChecked() == false) {<br />

showyourChoice_TextView.setText("");<br />

}<br />

}<br />

};<br />

public void showString() {<br />

showyourChoice_TextView.setText(showinfo);<br />

}<br />

5<br />

结 果<br />

23


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

RadioButton 单 选<br />

RadioGroup 组 与 onCheckedChanged 事 件<br />

1<br />

新 建 工 程<br />

2 string.xml 中 添 加 字 符 串<br />

<br />

<br />

Ex_Ctrl_6<br />

帅 哥 <br />

美 女 <br />

请 问 你 是 ??<br />

<br />

3 修 改 mian.xml 布 局 , 添 加 UI 元 素<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

24


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

4 修 改 mainActivity.java 文 件<br />

package zyf.Ex_Ctrl_6;<br />

import android.app.Activity;<br />

import android.os.Bundle;<br />

import android.widget.RadioButton;<br />

import android.widget.RadioGroup;<br />

import android.widget.TextView;<br />

public class Ex_Ctrl_6 extends Activity {<br />

/** Called when the activity is first created. */<br />

private TextView answer_TextView;<br />

private RadioButton boy_RadioButton,girl_RadioButton;<br />

private RadioGroup radioGroup;<br />

@Override<br />

public void onCreate(Bundle savedInstanceState) {<br />

super.onCreate(savedInstanceState);<br />

setContentView(R.layout.main);<br />

/* findViewById() 从 XML 中 获 取 资 源 对 象 */<br />

answer_TextView=(TextView)findViewById(R.id.TextView_Ask_And_Show);<br />

radioGroup=(RadioGroup)findViewById(R.id.RadioGroup);<br />

boy_RadioButton=(RadioButton)findViewById(R.id.RadioButton_Boy);<br />

girl_RadioButton=(RadioButton)findViewById(R.id.RadioButton_Gril);<br />

/* 给 单 RadioGroup 添 加 状 态 改 变 监 听 器 */<br />

radioGroup.setOnCheckedChangeListener(new<br />

new<br />

RadioGroup.OnCheckedChangeListener(){<br />

}<br />

}<br />

@Override<br />

public void onCheckedChanged(RadioGroup group, int checkedId) {<br />

// TODO Auto-generated method stub<br />

if(boy_RadioButton.isChecked()){<br />

answer_TextView.setText(R.string.iam_Boy);<br />

}else<br />

else{<br />

answer_TextView.setText(R.string.iamGirl);<br />

}<br />

}<br />

});<br />

25


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

5<br />

结 果<br />

26


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

RadioButton 猜 猜 看<br />

猜 猜 我 是 ??<br />

1<br />

新 建 项 目<br />

2<br />

准 备 三 张 png 图 片<br />

ic_menu_close_clear_cancel.png right.png wrong.png<br />

3 在 string.xml 中 添 加 要 使 用 的 字 符 串<br />

<br />

<br />

Ex_Ctrl_6<br />

帅 哥 <br />

美 女 <br />

猜 猜 我 是 ??<br />

回 答 <br />

清 空 <br />

恭 喜 !<br />

很 遗 憾 !<br />

OK<br />

您 答 对 了 !!<br />

哈 哈 , 错 误 !<br />

正 确 答 案 是 :<br />

<br />

4 在 main.xml 中 添 加 UI 元 素<br />

<br />

<br />

<br />

27


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

5 修 改 mainActivity.java 文 件<br />

package zyf.Ex_Ctrl_6;<br />

import java.util.Random;<br />

import android.app.Activity;<br />

import android.app.AlertDialog;<br />

import android.os.Bundle;<br />

import android.view.Menu;<br />

28


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

import android.view.MenuItem;<br />

import android.view.View;<br />

import android.widget.Button;<br />

import android.widget.RadioButton;<br />

import android.widget.RadioGroup;<br />

import android.widget.TextView;<br />

import android.widget.Toast;<br />

public class Ex_Ctrl_6 extends Activity implements Button.OnClickListener {<br />

/** Called when the activity is first created. */<br />

private TextView answer_TextView;<br />

private RadioButton boy_RadioButton, girl_RadioButton;<br />

private RadioGroup radioGroup;<br />

private Button answer_Button, clean_Button;<br />

private String[] boy_girl;<br />

private AlertDialog.Builder showRightorNot;<br />

private MenuItem exit;<br />

@Override<br />

public void onCreate(Bundle savedInstanceState) {<br />

super.onCreate(savedInstanceState);<br />

setContentView(R.layout.main);<br />

/* 结 果 显 示 对 话 框 */<br />

showRightorNot = new AlertDialog.Builder(this<br />

this);<br />

/* findViewById() 从 XML 中 获 取 资 源 对 象 */<br />

answer_TextView = (TextView) findViewById(R.id.TextView_Ask_And_Show);<br />

radioGroup = (RadioGroup) findViewById(R.id.RadioGroup);<br />

boy_RadioButton = (RadioButton) findViewById(R.id.RadioButton_Boy);<br />

girl_RadioButton = (RadioButton) findViewById(R.id.RadioButton_Gril);<br />

answer_Button = (Button) findViewById(R.id.answer_The_Q_button);<br />

clean_Button = (Button) findViewById(R.id.clean_The_Q_button);<br />

/* 答 案 数 组 */<br />

boy_girl = new String[] { "Boy", "Girl","Boy", "Girl",<br />

"Boy", "Girl","Boy", "Girl",<br />

"Boy" };<br />

/* 按 钮 设 置 成 不 可 选 */<br />

answer_Button.setEnabled(false<br />

false);<br />

clean_Button.setEnabled(false<br />

false);<br />

29


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

/* 给 单 RadioGroup 添 加 状 态 改 变 监 听 器 */<br />

radioGroup.setOnCheckedChangeListener(new<br />

new<br />

RadioGroup.OnCheckedChangeListener() {<br />

@Override<br />

public void onCheckedChanged(RadioGroup group,int<br />

checkedId){<br />

// TODO Auto-generated method stub<br />

/* 判 断 显 示 */<br />

if (boy_RadioButton.isChecked()) {<br />

answer_TextView.setText(R.string.iam_Boy);<br />

} else {<br />

answer_TextView.setText(R.string.iamGirl);<br />

}<br />

}<br />

});<br />

boy_RadioButton.setOnClickListener(new<br />

new RadioGroup.OnClickListener() {<br />

@Override<br />

public void onClick(View v) {<br />

// TODO Auto-generated method stub<br />

/* 按 钮 设 置 成 可 选 */<br />

answer_Button.setEnabled(true<br />

true);<br />

clean_Button.setEnabled(true<br />

true);<br />

}<br />

});<br />

girl_RadioButton.setOnClickListener(new<br />

new RadioGroup.OnClickListener() {<br />

@Override<br />

public void onClick(View v) {<br />

// TODO Auto-generated method stub<br />

/* 按 钮 设 置 成 可 选 */<br />

answer_Button.setEnabled(true<br />

true);<br />

clean_Button.setEnabled(true<br />

true);<br />

}<br />

}<br />

});<br />

/* 设 置 按 钮 事 件 监 听 器 */<br />

answer_Button.setOnClickListener(this<br />

this);<br />

clean_Button.setOnClickListener(this<br />

this);<br />

30


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

@Override<br />

public void onClick(View v) {<br />

// TODO Auto-generated method stub<br />

if (v.getId() == R.id.answer_The_Q_button) {<br />

if (boy_RadioButton.isChecked()) {<br />

checkTheAnswer("Boy");<br />

} else if (girl_RadioButton.isChecked()) {<br />

checkTheAnswer("Girl");<br />

}<br />

}<br />

if (v.getId() == R.id.clean_The_Q_button) {<br />

/* 按 钮 设 置 成 未 选 取 */<br />

boy_RadioButton.setChecked(false<br />

false);<br />

girl_RadioButton.setChecked(false<br />

false);<br />

/* 按 钮 设 置 成 不 可 选 */<br />

answer_Button.setEnabled(false<br />

false);<br />

clean_Button.setEnabled(false<br />

false);<br />

answer_TextView.setText(R.string.ask);<br />

}<br />

}<br />

private void checkTheAnswer(String checkstring) {<br />

// TODO Auto-generated method stub<br />

/* 检 测 提 示 */<br />

Toast.makeText(this<br />

this, " 检 测 答 案 …………", Toast.LENGTH_SHORT).show();<br />

/* 获 取 随 机 数 */<br />

Random random = new Random();<br />

int index = random.nextInt(9);<br />

if (boy_girl[index].equals(checkstring)) {<br />

/* 回 答 正 确 , 设 置 提 示 对 话 框 , 显 示 结 果 */<br />

showRightorNot.setIcon(R.drawable.right);<br />

showRightorNot.setTitle(R.string.showAnswerTitle_YES);<br />

showRightorNot.setPositiveButton(R.string.about_dialog_ok, null);<br />

showRightorNot.setMessage(R.string.right).show();<br />

Toast.makeText(this<br />

this,getString(R.string.answerIS)<br />

} else {<br />

/* 回 答 错 误 , 设 置 提 示 对 话 框 , 显 示 结 果 */<br />

showRightorNot.setIcon(R.drawable.wrong);<br />

+boy_girl[index],Toast.LENGTH_LONG).show();<br />

showRightorNot.setTitle(R.string.showAnswerTitle_NO);<br />

showRightorNot.setPositiveButton(R.string.about_dialog_ok, null);<br />

31


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

showRightorNot.setMessage(R.string.wrong).show();<br />

}<br />

}<br />

Toast.makeText(this<br />

this,getString(R.string.answerIS)+<br />

@Override<br />

public boolean onCreateOptionsMenu(Menu menu) {<br />

// TODO Auto-generated method stub<br />

}<br />

/* 添 加 退 出 菜 单 */<br />

exit=menu.add("Exit");<br />

boy_girl[index], Toast.LENGTH_LONG).show();<br />

/* 设 置 退 出 菜 单 图 片 */<br />

exit.setIcon(R.drawable.ic_menu_close_clear_cancel);<br />

return super.onCreateOptionsMenu(menu);<br />

}<br />

@Override<br />

public boolean onOptionsItemSelected(MenuItem item) {<br />

// TODO Auto-generated method stub<br />

}<br />

6<br />

/* 结 束 Activity*/<br />

finish();<br />

return super.onOptionsItemSelected(item);<br />

结 果<br />

32


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

封 面<br />

33


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

封 面<br />

1


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

<strong>Android</strong> 基 础 UI 编 程 4<br />

专 业 相 框 设 计<br />

ImageView 的 堆 叠 应 用<br />

1<br />

新 建 工 程<br />

2<br />

准 备 三 张 png 图 片<br />

left.png right.png photo.png<br />

3 修 改 main.xml 布 局 , 添 加 UI 元 素<br />

<br />

<br />

<br />

android:id="@+id/myImageView1"<br />

android:layout_width="wrap_content"<br />

android:layout_height="wrap_content"<br />

android:layout_x="0px"<br />

android:layout_y="36px"<br />

<br />

<br />

android:id="@+id/myImageView2"<br />

android:layout_width="wrap_content"<br />

android:layout_height="wrap_content"<br />

android:layout_x="0px"<br />

android:layout_y="36px"<br />

<br />


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

/><br />

android:id="@+id/myButton1"<br />

android:layout_width="105px"<br />

android:layout_height="66px"<br />

android:text="pic1"<br />

android:layout_x="9px"<br />

android:layout_y="356px"<br />

<br />

<br />

android:id="@+id/myButton2"<br />

android:layout_width="105px"<br />

android:layout_height="66px"<br />

android:text="pic2"<br />

android:layout_x="179px"<br />

android:layout_y="356px"<br />

<br />

4 修 改 mainActivity.java<br />

package zyf.Ex_Ctrl_7;<br />

import android.app.Activity;<br />

import android.os.Bundle;<br />

import android.view.View;<br />

import android.widget.Button;<br />

import android.widget.ImageView;<br />

public class Ex_Ctrl_7 extends Activity {<br />

/** Called when the activity is first created. */<br />

/* 声 明 Button、ImageView 对 象 */<br />

private ImageView mImageView01;<br />

private ImageView mImageView02;<br />

private Button mButton01;<br />

private Button mButton02;<br />

@Override<br />

public void onCreate(Bundle savedInstanceState) {<br />

super.onCreate(savedInstanceState);<br />

setContentView(R.layout.main);<br />

/* 取 得 Button、ImageView 对 象 */<br />

mImageView01 = (ImageView) findViewById(R.id.myImageView1);<br />

mImageView02 = (ImageView) findViewById(R.id.myImageView2);<br />

mButton01 = (Button) findViewById(R.id.myButton1);<br />

mButton02 = (Button) findViewById(R.id.myButton2);<br />

/* 设 置 ImageView 背 景 图 */<br />

mImageView01.setImageDrawable(getResources().getDrawable(<br />

R.drawable.right));<br />

3


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

}<br />

}<br />

mImageView02.setImageDrawable(getResources().getDrawable(<br />

R.drawable.photo));<br />

/* 用 OnClickListener 事 件 来 启 动 */<br />

mButton01.setOnClickListener(new<br />

new Button.OnClickListener() {<br />

@Override<br />

public void onClick(View v) {<br />

}<br />

/* 当 启 动 后 , ImageView 立 刻 换 背 景 图 */<br />

mImageView01.setImageDrawable(getResources().getDrawable(<br />

R.drawable.right));<br />

});<br />

mButton02.setOnClickListener(new<br />

new Button.OnClickListener() {<br />

});<br />

@Override<br />

public void onClick(View v) {<br />

}<br />

mImageView01.setImageDrawable(getResources().getDrawable(<br />

R.drawable.left));<br />

5<br />

结 果<br />

4


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

ImageButton 的 堆 叠 应 用<br />

1<br />

新 建 项 目<br />

2<br />

准 备 三 张 png 图 片<br />

left.png right.png photo.png<br />

3 修 改 main.xml 布 局 , 添 加 UI 元 素<br />

<br />

<br />

<br />

设 置 成 堆 叠<br />

<br />

<br />

4 修 改 mainActivity.java<br />

package zyf.Ex_Ctrl_7_B;<br />

import android.app.Activity;<br />

import android.os.Bundle;<br />

import android.view.View;<br />

import android.widget.ImageButton;<br />

5


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

public class Ex_Ctrl_7_B extends Activity {<br />

/** Called when the activity is first created. */<br />

/* 声 明 ImageButton*/<br />

private ImageButton back_Imagebutton,photo_Imagebutton;<br />

private boolean Tag=true<br />

true;<br />

@Override<br />

public void onCreate(Bundle savedInstanceState) {<br />

super.onCreate(savedInstanceState);<br />

setContentView(R.layout.main);<br />

/* 从 XML 中 获 取 控 件 对 象 */<br />

back_Imagebutton=(ImageButton)findViewById(R.id.myImageButton_Back);<br />

photo_Imagebutton=(ImageButton)findViewById(R.id.myImageButton_Photo);<br />

}<br />

}<br />

// 设 置 默 认 的 背 景 图 片<br />

back_Imagebutton.setBackgroundResource(R.drawable.left);<br />

photo_Imagebutton.setBackgroundResource(R.drawable.photo);<br />

// 给 ImageButton 设 置 事 件 监 听 器<br />

photo_Imagebutton.setOnClickListener(new<br />

new ImageButton.OnClickListener(){<br />

});<br />

@Override<br />

public void onClick(View v) {<br />

// TODO Auto-generated method stub<br />

}<br />

Tag=!Tag;// 更 改 背 景 图 片<br />

if(Tag){<br />

back_Imagebutton.setBackgroundResource(R.drawable.right);<br />

}else<br />

else{<br />

}<br />

back_Imagebutton.setBackgroundResource(R.drawable.left);<br />

5<br />

结 果<br />

6


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

自 定 义 下 拉 菜 单<br />

Spinner 与 setDropDownViewResource<br />

1<br />

新 建 项 目 , 在 res 目 录 下 新 建 一 个 anim 文 件 夹 , 存 放 动 画 效 果 用 , 在 其 中 新 建 一 个 my_anim.xml 文<br />

件<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

2 在 res 目 录 下 的 layout 文 件 夹 中 新 建 一 个 myspinner_dropdown.xml 文 件 , 用 来 存 放 下 拉 菜 单 弹 出 内<br />

容 的 布 局<br />

<br />

<br />

3 修 改 main.xml, 添 加 UI 元 素<br />

<br />

<br />


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

android:layout_height="wrap_content"<br />

android:text=" 你 选 择 的 是 "<br />

android:textSize="25sp"><br />

<br />

<br />

<br />

<br />

4<br />

定 义 一 个 下 拉 菜 单<br />

private Spinner mySpinner;<br />

/* 以 findViewById() 取 得 对 象 */<br />

mySpinner = (Spinner) findViewById(R.id.spinner_City);<br />

5 定 义 一 个 字 符 串 数 组 和 一 个 ArrayAdepter<br />

private static final String[] countriesStr =<br />

{ " 北 京 市 ", " 上 海 市 ", " 天 津 市 ", " 重 庆 市 " };<br />

private ArrayAdapter adapter;<br />

adapter=new<br />

ArrayAdapter(this<br />

this,<br />

android.R.layout.simple_spinner_item, countriesStr);<br />

6<br />

给 下 拉 菜 单 内 容 设 置 样 式<br />

/* myspinner_dropdown 为 自 定 义 下 拉 菜 单 样 式 定 义 在 res/layout 目 录 下 */<br />

adapter.setDropDownViewResource(R.layout.myspinner_dropdown);<br />

7<br />

给 下 拉 菜 单 设 置 内 容 适 配 器<br />

/* 将 ArrayAdapter 添 加 Spinner 对 象 中 */<br />

mySpinner.setAdapter(adapter);<br />

8<br />

给 下 拉 菜 单 添 加 动 画<br />

/* 取 得 Animation 定 义 在 res/anim 目 录 下 */<br />

myAnimation = AnimationUtils.loadAnimation(this<br />

this, R.anim.my_anim);<br />

/* 将 mySpinner 运 行 Animation */<br />

mySpinner.startAnimation(myAnimation);<br />

9 mainActivity.java 完 整 代 码<br />

package zyf.Ex_Ctrl_8;<br />

import android.app.Activity;<br />

import android.os.Bundle;<br />

8


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

import android.view.MotionEvent;<br />

import android.view.View;<br />

import android.view.animation.Animation;<br />

import android.view.animation.AnimationUtils;<br />

import android.widget.AdapterView;<br />

import android.widget.ArrayAdapter;<br />

import android.widget.Spinner;<br />

import android.widget.TextView;<br />

public class Ex_Ctrl_8 extends Activity {<br />

/** Called when the activity is first created. */<br />

private static final String[] countriesStr =<br />

{ " 北 京 市 ", " 上 海 市 ", " 天 津 市 ", " 重 庆 市 " };<br />

private TextView myTextView;<br />

private Spinner mySpinner;<br />

private ArrayAdapter adapter;<br />

Animation myAnimation;<br />

@Override<br />

public void onCreate(Bundle savedInstanceState) {<br />

super.onCreate(savedInstanceState);<br />

/* 载 入 main.xml Layout */<br />

setContentView(R.layout.main);<br />

/* 以 findViewById() 取 得 对 象 */<br />

myTextView = (TextView) findViewById(R.id.TextView_Show);<br />

mySpinner = (Spinner) findViewById(R.id.spinner_City);<br />

/* 取 得 Animation 定 义 在 res/anim 目 录 下 */<br />

myAnimation = AnimationUtils.loadAnimation(this<br />

this, R.anim.my_anim);<br />

adapter=new<br />

android.R.layout.simple_spinner_item, countriesStr);<br />

ArrayAdapter(this<br />

this,<br />

/* myspinner_dropdown 为 自 定 义 下 拉 菜 单 样 式 定 义 在 res/layout 目 录 下 */<br />

adapter.setDropDownViewResource(R.layout.myspinner_dropdown);<br />

/* 将 ArrayAdapter 添 加 Spinner 对 象 中 */<br />

mySpinner.setAdapter(adapter);<br />

/* 下 拉 菜 单 弹 出 的 内 容 选 项 被 选 中 事 件 处 理 */<br />

mySpinner.setOnItemSelectedListener(new<br />

new<br />

Spinner.OnItemSelectedListener(){<br />

public void onItemSelected(AdapterView arg0, View arg1,<br />

int arg2, long arg3) {<br />

// TODO Auto-generated method stub<br />

/* 将 所 选 mySpinner 的 值 带 入 myTextView 中 */<br />

myTextView.setText(" 您 选 择 的 是 :"+ countriesStr[arg2]);<br />

/* 将 mySpinner 显 示 */<br />

9


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

}<br />

arg0.setVisibility(View.VISIBLE);<br />

public void onNothingSelected(AdapterView arg0) {<br />

// TODO Auto-generated method stub<br />

myTextView.setText("NONE");<br />

}<br />

});<br />

/* 下 拉 菜 单 弹 出 的 内 容 选 项 触 屏 事 件 处 理 */<br />

mySpinner.setOnTouchListener(new<br />

new Spinner.OnTouchListener(){<br />

});<br />

public boolean onTouch(View v, MotionEvent event) {<br />

// TODO Auto-generated method stub<br />

}<br />

/* 将 mySpinner 运 行 Animation */<br />

v.startAnimation(myAnimation);<br />

/* 将 mySpinner 隐 藏 */<br />

v.setVisibility(View.INVISIBLE);<br />

return false;<br />

/* 下 拉 菜 单 弹 出 的 内 容 选 项 焦 点 改 变 事 件 处 理 */<br />

mySpinner.setOnFocusChangeListener(new<br />

new Spinner.OnFocusChangeListener(){<br />

}<br />

}<br />

public void onFocusChange(View v, boolean hasFocus) {<br />

// TODO Auto-generated method stub<br />

}<br />

});<br />

10<br />

结 果<br />

10


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

动 态 添 加 ╱ 删 除 的 Spinner 菜 单<br />

ArrayList 与 Widget 的 依 赖 性<br />

1<br />

创 建 新 工 程<br />

2 修 改 mian.xml 布 局 , 添 加 UI 元 素<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

android:text=" 删 除 "<br />

><br />

<br />

<br />

<br />

<br />

3<br />

定 义 创 建 一 个 List<br />

/* 定 义 */<br />

private String[] cities;<br />

private List cityList;<br />

/* 初 始 化 字 符 串 数 组 */<br />

cities = new String[] { "<strong>Android</strong>", "BlackBerry", "J2ME", "Symbian",<br />

"Broncho", "LinuxMobile", "Palm", "WindwosMobile" };<br />

/* 初 始 化 List 实 例 ArrayList 的 对 象 */<br />

cityList = new ArrayList();<br />

/* 遍 历 , 把 字 符 串 数 组 添 加 到 ArrayList 中 */<br />

for (int<br />

i = 0; i < cities.length; i++) {<br />

cityList.add(cities[i]);<br />

}<br />

4<br />

定 义 创 建 一 个 ArrayAdapter<br />

/* 定 义 */<br />

private ArrayAdapter arrayAdapter;<br />

/* 这 里 应 该 使 用 List , 如 果 使 用 String[] 则 会 出 错 */<br />

/* 初 始 化 下 拉 菜 单 的 内 容 适 配 器 */<br />

arrayAdapter = new ArrayAdapter(this<br />

this,<br />

android.R.layout.simple_spinner_item, cityList);<br />

5<br />

设 置 ArrayAdapter 在 下 拉 菜 单 中 的 显 示 布 局<br />

/* 设 置 下 拉 菜 单 显 示 内 容 的 风 格 */<br />

arrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_<br />

item);<br />

6<br />

给 下 拉 菜 单 添 加 内 容 Adapter 适 配 器<br />

/* 给 下 拉 菜 单 对 象 添 加 内 容 适 配 器 */<br />

city_Spinner.setAdapter(arrayAdapter);<br />

12


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

7 修 改 该 mainActivity.java, 实 现 动 态 添 加 和 删 除<br />

package zyf.Ex_Ctrl_9ME;<br />

/* 使 用 的 包 导 入 */<br />

import java.util.ArrayList;<br />

import java.util.List;<br />

import android.app.Activity;<br />

import android.os.Bundle;<br />

import android.view.Menu;<br />

import android.view.MenuItem;<br />

import android.view.View;<br />

import android.widget.AdapterView;<br />

import android.widget.ArrayAdapter;<br />

import android.widget.Button;<br />

import android.widget.EditText;<br />

import android.widget.Spinner;<br />

import android.widget.TextView;<br />

import android.widget.Toast;<br />

public class Ex_Ctrl_9ME extends Activity implements Button.OnClickListener,<br />

Spinner.OnItemSelectedListener {<br />

/** Called when the activity is first created. */<br />

/* 声 明 程 序 使 用 的 对 象 */<br />

private TextView show_yourChoice_TextView;<br />

private EditText input_City_EditText;<br />

private Button Add_Button, Del_Button;<br />

private Spinner city_Spinner;<br />

private ArrayAdapter arrayAdapter;<br />

private String[] cities;<br />

private String addString;<br />

private List cityList;<br />

@Override<br />

public void onCreate(Bundle savedInstanceState) {<br />

super.onCreate(savedInstanceState);<br />

/* 设 置 主 屏 显 示 布 局 为 main.xml*/<br />

setContentView(R.layout.main);<br />

/*findViewByID() 获 取 XML 中 的 UI 元 素 */<br />

show_yourChoice_TextView =<br />

(TextView) findViewById(R.id.TextView_Show_yourChoice);<br />

input_City_EditText = (EditText) findViewById(R.id.EditView_Input);<br />

Add_Button = (Button) findViewById(R.id.Button_ADD);<br />

Del_Button = (Button) findViewById(R.id.Button_DEL);<br />

city_Spinner = (Spinner) findViewById(R.id.Spinner_Slecte);<br />

/* 初 始 化 字 符 串 数 组 */<br />

cities = new String[] { "<strong>Android</strong>", "BlackBerry", "J2ME",<br />

13


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

/* 初 始 化 List 实 例 ArrayList 的 对 象 */<br />

cityList = new ArrayList();<br />

"Symbian","Broncho", "LinuxMobile",<br />

"Palm", "WindwosMobile" };<br />

/* 遍 历 , 把 字 符 串 数 组 添 加 到 ArrayList 中 */<br />

for (int<br />

i = 0; i < cities.length; i++) {<br />

}<br />

cityList.add(cities[i]);<br />

/* 这 里 应 该 使 用 List , 如 果 使 用 String[] 则 会 出 错 */<br />

/* 初 始 化 下 拉 菜 单 的 内 容 适 配 器 */<br />

arrayAdapter = new ArrayAdapter(this<br />

this,<br />

android.R.layout.simple_spinner_item, cityList);<br />

/* 设 置 下 拉 菜 单 显 示 内 容 的 风 格 */<br />

arrayAdapter<br />

.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);<br />

}<br />

/* 给 下 拉 菜 单 对 象 添 加 内 容 适 配 器 */<br />

city_Spinner.setAdapter(arrayAdapter);<br />

/* 默 认 启 动 时 文 本 标 题 显 示 */<br />

show_yourChoice_TextView.setText(arrayAdapter.getItem(0));<br />

/* 默 认 启 动 时 下 拉 菜 单 第 一 项 被 选 中 */<br />

city_Spinner.setSelection(0);<br />

/* 为 按 钮 添 加 点 击 事 件 监 听 器 */<br />

Add_Button.setOnClickListener(this<br />

this);<br />

Del_Button.setOnClickListener(this<br />

this);<br />

/* 为 下 拉 菜 单 添 加 选 项 选 中 事 件 监 听 器 */<br />

city_Spinner.setOnItemSelectedListener(this<br />

this);<br />

@Override<br />

public void onClick(View v) {<br />

// TODO Auto-generated method stub<br />

switch (v.getId()) {<br />

/* 区 别 按 钮 来 进 行 不 同 动 作 */<br />

case R.id.Button_ADD:<br />

/* 显 示 Toast 提 示 */<br />

Toast.makeText(this<br />

this, " 添 加 ", Toast.LENGTH_SHORT).show();<br />

/* 获 得 输 入 框 中 的 将 要 添 加 的 字 符 串 */<br />

addString = input_City_EditText.getText().toString();<br />

/* 遍 历 , 比 较 是 否 和 下 拉 菜 单 中 内 容 重 复 */<br />

for (int<br />

i = 0; i < arrayAdapter.getCount(); i++) {<br />

if (addString.equals(arrayAdapter.getItemId(i))) {<br />

return;<br />

}<br />

/* 重 复 了 , 则 跳 出 */<br />

14


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

}<br />

/* 如 果 添 加 字 符 串 不 为 ""*/<br />

if (!addString.equals("")) {<br />

/* 添 加 进 适 配 器 中 */<br />

arrayAdapter.add(addString);<br />

/* 获 取 刚 刚 添 加 进 的 字 符 串 位 置 */<br />

int post = arrayAdapter.getPosition(addString);<br />

/* 设 置 刚 刚 添 加 进 的 下 拉 菜 单 内 容 被 选 中 */<br />

city_Spinner.setSelection(post);<br />

/* 清 空 输 入 框 */<br />

input_City_EditText.setText("");<br />

}<br />

break;<br />

case R.id.Button_DEL:<br />

if (city_Spinner.getSelectedItem() != null) {<br />

/* 删 除 mySpinner 的 值 */<br />

arrayAdapter.remove(city_Spinner.getSelectedItem().toString());<br />

}<br />

/* 将 myEditText 清 空 */<br />

input_City_EditText.setText("");<br />

if (arrayAdapter.getCount() == 0) {<br />

}<br />

}<br />

break;<br />

default:<br />

break;<br />

}<br />

/* 将 myTextView 清 空 */<br />

Toast.makeText(this<br />

this, " 删 完 了 ", Toast.LENGTH_SHORT).show();<br />

show_yourChoice_TextView.setText("");<br />

/* 下 拉 菜 单 选 项 被 选 中 事 件 处 理 */<br />

@Override<br />

public void onItemSelected(AdapterView arg0, View arg1, int arg2,<br />

long arg3) {<br />

// TODO Auto-generated method stub<br />

}<br />

show_yourChoice_TextView.setText(arrayAdapter.getItem(arg2));<br />

/* 未 被 选 中 事 件 处 理 */<br />

@Override<br />

public void onNothingSelected(AdapterView arg0) {<br />

// TODO Auto-generated method stub<br />

15


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

}<br />

}<br />

/* 添 加 Menu 菜 单 进 行 退 出 操 作 */<br />

@Override<br />

public boolean onCreateOptionsMenu(Menu menu) {<br />

// TODO Auto-generated method stub<br />

}<br />

menu.add("Exit");<br />

return super.onCreateOptionsMenu(menu);<br />

/*Menu 菜 单 退 出 */<br />

@Override<br />

public boolean onOptionsItemSelected(MenuItem item) {<br />

// TODO Auto-generated method stub<br />

}<br />

finish();<br />

return super.onOptionsItemSelected(item);<br />

8<br />

结 果<br />

16


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

相 簿 浏 览 Gallery<br />

Gallery 与 衍 生 BaseAdapter 容 器<br />

1<br />

新 建 项 目<br />

2 定 义 layout 外 部 resource 的 xml 文 件 , 用 来 改 变 layout 的 背 景<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

3 修 改 main.xml 布 局 , 添 加 一 个 Gallery 和 一 个 ImageView<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

17


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

4 新 建 一 个 myImageAdapter 类 --Gallery 的 适 配 器 , 它 继 承 于 BaseAdapter 类 .<br />

package zyf.Ex_Ctrl_10ME;<br />

import android.view.View;<br />

import android.view.ViewGroup;<br />

import android.widget.BaseAdapter;<br />

public class myImageAdapter extends BaseAdapter {<br />

@Override<br />

public int getCount() {<br />

// TODO Auto-generated method stub<br />

return 0;<br />

}<br />

@Override<br />

public Object getItem(int<br />

position) {<br />

// TODO Auto-generated method stub<br />

return null;<br />

}<br />

@Override<br />

public long getItemId(int<br />

position) {<br />

// TODO Auto-generated method stub<br />

return 0;<br />

}<br />

@Override<br />

public View getView(int<br />

int position, View convertView, ViewGroup parent) {<br />

// TODO Auto-generated method stub<br />

return null;<br />

}<br />

}<br />

5 修 改 mainActivity.java, 添 加 Gallery 相 关 操 作<br />

package zyf.Ex_Ctrl_10ME;<br />

import android.app.Activity;<br />

import android.os.Bundle;<br />

import android.view.View;<br />

import android.widget.AdapterView;<br />

import android.widget.Gallery;<br />

import android.widget.ImageView;<br />

import android.widget.Toast;<br />

public class Ex_Ctrl_10ME extends Activity {<br />

/** Called when the activity is first created. */<br />

/* 定 义 要 使 用 的 对 象 */<br />

private Gallery gallery;<br />

private ImageView imageview;<br />

18


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

private myImageAdapter imageadapter;<br />

@Override<br />

public void onCreate(Bundle savedInstanceState) {<br />

super.onCreate(savedInstanceState);<br />

setContentView(R.layout.main);<br />

imageadapter=new<br />

myImageAdapter(this<br />

this);<br />

/* 通 过 findViewById 取 得 资 源 对 象 */<br />

gallery=(Gallery)findViewById(R.id.Gallery_preView);<br />

imageview=(ImageView)findViewById(R.id.ImageView_photo);<br />

/* 给 Gallery 设 置 适 配 器 把 Ex_Ctrl_10ME 类 传 入 参 数 */<br />

gallery.setAdapter(imageadapter);<br />

/* 设 置 Gallery 的 点 击 事 件 监 听 器 */<br />

gallery.setOnItemClickListener(new<br />

new Gallery.OnItemClickListener(){<br />

@Override<br />

public void onItemClick(AdapterView parent, View v, int position,<br />

long id) {<br />

// TODO Auto-generated method stub<br />

/* 显 示 该 图 片 是 几 号 */<br />

Toast.makeText(Ex_Ctrl_10ME.this<br />

this,<br />

" 这 是 图 片 :"+position+" 号 ", Toast.LENGTH_SHORT).show();<br />

}<br />

}<br />

});<br />

/* 设 置 大 图 片 */<br />

imageview.setBackgroundResource(imageadapter.myImageIds[position]);<br />

}<br />

6 修 改 myImageAdapter.java 文 件 , 实 现 相 簿 浏 览 效 果<br />

package zyf.Ex_Ctrl_10ME;<br />

import android.content.Context;<br />

import android.content.res.TypedArray;<br />

import android.view.View;<br />

import android.view.ViewGroup;<br />

import android.widget.BaseAdapter;<br />

import android.widget.Gallery;<br />

import android.widget.ImageView;<br />

public class myImageAdapter extends BaseAdapter{// 自 定 义 的 类 变 量<br />

/* 变 量 声 明 */<br />

int mGalleryItemBackground;<br />

private Context context;// 上 下 文<br />

/* 构 建 一 Integer array 并 取 得 预 加 载 Drawable 的 图 片 id */<br />

19


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

public Integer[] myImageIds = { R.drawable.photo1, R.drawable.photo2,<br />

R.drawable.photo3, R.drawable.photo4, R.drawable.photo5,<br />

R.drawable.photo6, };<br />

/* 自 定 义 的 构 造 方 法 */<br />

public myImageAdapter(Context context) {<br />

// TODO Auto-generated constructor stub<br />

this.context=context;<br />

/*<br />

* 使 用 在 res/values/attrs.xml 中 的 定 义 的 Gallery 属 性 .<br />

*/<br />

TypedArray<br />

typed_array=context.obtainStyledAttributes(R.styleable.Gallery);<br />

/* 取 得 Gallery 属 性 的 Index id */<br />

mGalleryItemBackground=typed_array.getResourceId(R.styleable.Gallery_andro<br />

id_galleryItemBackground, 0);<br />

}<br />

/* 让 对 象 的 styleable 属 性 能 够 反 复 使 用 */<br />

typed_array.recycle();<br />

/* 重 写 的 方 法 getCount, 返 回 图 片 数 目 */<br />

@Override<br />

public int getCount() {<br />

// TODO Auto-generated method stub<br />

return myImageIds.length;<br />

}<br />

/* 重 写 的 方 法 getItemId, 返 回 图 像 的 数 组 id */<br />

@Override<br />

public Object getItem(int<br />

position) {<br />

// TODO Auto-generated method stub<br />

return position;<br />

}<br />

@Override<br />

public long getItemId(int<br />

position) {<br />

// TODO Auto-generated method stub<br />

return position;<br />

}<br />

/* 重 写 的 方 法 getView, 返 回 一 View 对 象 */<br />

@Override<br />

public View getView(int<br />

int position, View convertView, ViewGroup parent) {<br />

// TODO Auto-generated method stub<br />

/* 产 生 ImageView 对 象 */<br />

ImageView imageview = new ImageView(context);<br />

/* 设 置 图 片 给 imageView 对 象 */<br />

imageview.setImageResource(myImageIds[position]);<br />

20


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

}<br />

}<br />

/* 重 新 设 置 图 片 的 宽 高 */<br />

imageview.setScaleType(ImageView.ScaleType.FIT_XY);<br />

/* 重 新 设 置 Layout 的 宽 高 */<br />

imageview.setLayoutParams(new<br />

Gallery.LayoutParams(128, 128));<br />

/* 设 置 Gallery 背 景 图 */<br />

imageview.setBackgroundResource(mGalleryItemBackground);<br />

/* 返 回 imageView 对 象 */<br />

return imageview;<br />

7<br />

结 果<br />

21


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

文 件 搜 索 引 擎 FileSearch<br />

SDCard 中 文 件 搜 索 与 File 类<br />

1<br />

创 建 新 工 程<br />

2 在 string.xml 添 加 程 序 中 要 使 用 的 字 符 串<br />

<br />

<br />

myFileTest<br />

输 入 关 键 字 <br />

搜 索 <br />

系 统 SDCard 目 录 文 件 路 径 :\n<br />

请 输 入 关 键 字 !!<br />

没 有 找 到 相 关 文 件 !!<br />

读 取 路 径 出 错 !!<br />

<br />

3 修 改 main.xml 布 局 , 添 加 两 个 TextView、 一 个 EditText、 一 个 Button<br />

<br />

<br />

<br />

<br />

<br />

<br />

22


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

<br />

<br />

<br />

<br />

<br />

4 修 改 mainActivity.java 文 件 , 添 加 搜 索 功 能<br />

package zyf.myFileTest;<br />

/* 导 入 程 序 使 用 的 包 */<br />

import java.io.File;<br />

import android.app.Activity;<br />

import android.os.Bundle;<br />

import android.view.View;<br />

import android.widget.Button;<br />

import android.widget.EditText;<br />

import android.widget.TextView;<br />

import android.widget.Toast;<br />

public class myFileTest extends Activity implements Button.OnClickListener {<br />

/** Called when the activity is first created. */<br />

/* 定 义 程 序 要 使 用 的 类 对 象 */<br />

private File file;<br />

private String path;<br />

private String info;<br />

private String theKey_formInput;<br />

private TextView show_Result;<br />

private EditText input_SearchKey_Edit;<br />

private Button toSearch_Button;<br />

@Override<br />

public void onCreate(Bundle savedInstanceState) {<br />

super.onCreate(savedInstanceState);<br />

23


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

}<br />

/* 设 置 主 屏 布 局 为 main.xml*/<br />

setContentView(R.layout.main);<br />

/* 通 过 findViewById() 获 取 XML 中 的 UI 对 象 */<br />

show_Result = (TextView) findViewById(R.id.TextView_Result);<br />

input_SearchKey_Edit = (EditText) findViewById(R.id.input_KEY_EditText);<br />

toSearch_Button = (Button) findViewById(R.id.Button_Search);<br />

/* 为 搜 索 按 钮 添 加 点 击 事 件 监 听 器 */<br />

toSearch_Button.setOnClickListener(this<br />

this);<br />

/* 初 始 化 一 个 Field 对 象 , 指 定 路 径 为 /sdcard*/<br />

file = new File("/sdcard");<br />

/* 从 xml 中 获 取 字 符 串 */<br />

info = getString(R.string.info);<br />

/* 按 钮 点 击 事 件 处 理 */<br />

public void onClick(View v) {<br />

// TODO Auto-generated method stub<br />

}<br />

/* 清 空 */<br />

path = "";<br />

show_Result.setText("");<br />

/* 取 得 输 入 框 中 的 要 查 询 的 Key*/<br />

theKey_formInput = input_SearchKey_Edit.getText().toString();<br />

/* 浏 览 文 件 */<br />

BrowserFile(file);<br />

/* 浏 览 文 件 方 法 */<br />

public void BrowserFile(File file) {<br />

if (theKey_formInput.equals("")) {<br />

}<br />

/* 如 果 输 入 框 没 有 输 入 点 击 搜 索 按 钮 , 提 示 输 入 */<br />

Toast.makeText(this<br />

this, getString(R.string.pleaseInput),<br />

} else {<br />

}<br />

Toast.LENGTH_SHORT).show();<br />

/* 开 始 搜 索 文 件 */<br />

ToSearchFiles(file);<br />

/* 搜 索 完 毕 后 , 如 果 搜 到 结 果 为 空 , 提 示 没 有 找 到 */<br />

if (show_Result.getText().equals("")) {<br />

Toast.makeText(this<br />

this, getString(R.string.notFond),<br />

}<br />

Toast.LENGTH_SHORT).show();<br />

/* 开 始 搜 索 文 件 方 法 */<br />

public void ToSearchFiles(File file) {<br />

/* 定 义 一 个 File 文 件 数 组 , 用 来 存 放 /sdcard 目 录 下 的 文 件 或 文 件 夹 */<br />

File[] the_Files = file.listFiles();<br />

24


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

}<br />

}<br />

/* 通 过 遍 历 所 有 文 件 和 文 件 夹 */<br />

for (File tempF : the_Files) {<br />

if (tempF.isDirectory()) {<br />

}<br />

ToSearchFiles(tempF);<br />

/* 如 果 是 文 件 夹 的 话 继 续 遍 历 搜 索 */<br />

} else {<br />

try {<br />

}<br />

/* 是 文 件 , 进 行 比 较 , 如 果 文 件 名 称 中 包 含 输 入 搜 索 Key, 则 返 回 大 于 -1 的 值 */<br />

if (tempF.getName().indexOf(theKey_formInput) > -1) {<br />

/* 获 取 符 合 条 件 文 件 的 路 径 , 进 行 累 加 */<br />

path += "\n" + tempF.getPath();<br />

/* 显 示 结 果 的 TextView 显 示 信 息 和 搜 索 到 的 路 径 */<br />

show_Result.setText(info + path);<br />

}<br />

} catch (Exception e) {<br />

// TODO: handle exception<br />

}<br />

/* 如 果 路 径 找 不 到 , 提 示 出 错 */<br />

Toast.makeText(this<br />

this, getString(R.string.pathError),<br />

Toast.LENGTH_SHORT).show();<br />

5<br />

结 果<br />

25


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

按 钮 点 击 变 换<br />

ImageButton 选 择 特 效<br />

1<br />

新 建 工 程<br />

2 修 改 main.xml 布 局 , 添 加 一 个 TextView、 两 个 ImageButton<br />

<br />

<br />

android:id="@+id/widget0"<br />

android:layout_width="fill_parent"<br />

android:layout_height="fill_parent"<br />

xmlns:android="http://schemas.android.com/apk/res/android"<br />

<br />

android:id="@+id/showinform_TextView"<br />

android:layout_width="259px"<br />

android:layout_height="80px"<br />

android:text=" 没 有 按 钮 事 件 "<br />

android:textSize="20px"<br />

android:layout_x="32px"<br />

android:layout_y="33px"<br />

<br />

<br />

<br />

<br />

<br />

<br />

26


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

3 修 改 mainActivity.java 文 件 , 实 现 选 择 效 果<br />

package zyf.Ex_Ctrl_12ME;<br />

/* 导 入 使 用 的 包 */<br />

import android.app.Activity;<br />

import android.os.Bundle;<br />

import android.view.View;<br />

import android.widget.ImageButton;<br />

import android.widget.TextView;<br />

public class Ex_Ctrl_12ME extends Activity implements<br />

ImageButton.OnClickListener {<br />

/** Called when the activity is first created. */<br />

/* 定 义 使 用 的 类 对 象 */<br />

private TextView showyourClick;<br />

private ImageButton button_A, button_B;<br />

@Override<br />

public void onCreate(Bundle savedInstanceState) {<br />

super.onCreate(savedInstanceState);<br />

}<br />

/* 载 入 主 屏 布 局 main.xml */<br />

setContentView(R.layout.main);<br />

/* 从 XML 中 获 取 UI 元 素 对 象 */<br />

showyourClick = (TextView) findViewById(R.id.showinform_TextView);<br />

button_A = (ImageButton) findViewById(R.id.ImageButton_A);<br />

button_B = (ImageButton) findViewById(R.id.ImageButton_B);<br />

/* 给 两 个 ImageButton 添 加 点 击 事 件 监 听 器 */<br />

button_A.setOnClickListener(this<br />

this);<br />

button_B.setOnClickListener(this<br />

this);<br />

/* button 点 击 事 件 处 理 */<br />

@Override<br />

public void onClick(View v) {<br />

// TODO Auto-generated method stub<br />

switch (v.getId()) {<br />

case R.id.ImageButton_A: {<br />

}<br />

/*button_A 按 钮 被 点 击 */<br />

/* 显 示 信 息 */<br />

showyourClick.setText(" 你 点 击 了 :\nbutton_A");<br />

/* 切 换 背 景 图 片 */<br />

button_A.setBackgroundResource(R.drawable.android);<br />

button_B.setBackgroundResource(R.drawable.installer);<br />

27


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

}<br />

}<br />

break;<br />

case R.id.ImageButton_B: {<br />

/*button_B 按 钮 被 点 击 */<br />

/* 显 示 信 息 */<br />

showyourClick.setText(" 你 点 击 了 :\nbutton_B");<br />

/* 切 换 背 景 图 片 */<br />

button_B.setBackgroundResource(R.drawable.android);<br />

button_A.setBackgroundResource(R.drawable.ipod);<br />

}<br />

break;<br />

default:<br />

break;<br />

}<br />

4<br />

结 果<br />

28


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

自 动 完 成 输 入 框 自 动 提 示 功 能 的 菜 单<br />

AutoCompleteTextView 与 数 组<br />

1<br />

新 建 工 程<br />

2 修 改 main.xml 布 局 , 添 加 一 个 TextView、 一 个 AutoCompleteTextView、 一 个 Button<br />

<br />

<br />

android:id="@+id/widget0"<br />

android:layout_width="fill_parent"<br />

android:layout_height="fill_parent"<br />

xmlns:android="http://schemas.android.com/apk/res/android"<br />

<br />

android:id="@+id/TextView_InputShow"<br />

android:layout_width="228px"<br />

android:layout_height="47px"<br />

android:text=" 请 输 入 "<br />

android:textSize="25px"<br />

android:layout_x="42px"<br />

android:layout_y="37px"<br />

<br />

<br />

android:id="@+id/AutoCompleteTextView_input"<br />

android:layout_width="275px"<br />

android:layout_height="wrap_content"<br />

android:text=""<br />

android:textSize="18sp"<br />

android:layout_x="23px"<br />

android:layout_y="98px"<br />

<br />

<br />

<br />

<br />

29


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

3 修 改 mainActivity.java, 添 加 自 动 完 成 功 能<br />

package zyf.Ex_Ctrl_13ME;<br />

/* 导 入 使 用 的 包 */<br />

import android.app.Activity;<br />

import android.os.Bundle;<br />

import android.view.View;<br />

import android.widget.ArrayAdapter;<br />

import android.widget.AutoCompleteTextView;<br />

import android.widget.Button;<br />

import android.widget.TextView;<br />

public class Ex_Ctrl_13ME extends Activity {<br />

/** Called when the activity is first created. */<br />

/* 定 义 要 使 用 的 类 对 象 */<br />

private String[] normalString =<br />

new String[] {<br />

"<strong>Android</strong>", "<strong>Android</strong> Blog","<strong>Android</strong> Market", "<strong>Android</strong> SDK",<br />

"<strong>Android</strong> AVD","BlackBerry","BlackBerry JDE", "Symbian",<br />

"Symbian Carbide", "Java 2ME","Java FX", "Java 2EE",<br />

"Java 2SE", "Mobile", "Motorola", "Nokia", "Sun",<br />

"Nokia Symbian", "Nokia forum", "WindowsMobile", "Broncho",<br />

"Windows XP", "Google", "Google <strong>Android</strong> ", "Google 浏 览 器 ",<br />

"IBM", "MicroSoft", "Java", "C++", "C", "C#", "J#", "VB" };<br />

@SuppressWarnings("unused")<br />

private TextView show;<br />

private AutoCompleteTextView autoTextView;<br />

private Button clean;<br />

private ArrayAdapter arrayAdapter;<br />

@Override<br />

public void onCreate(Bundle savedInstanceState) {<br />

super.onCreate(savedInstanceState);<br />

/* 装 入 主 屏 布 局 main.xml*/<br />

setContentView(R.layout.main);<br />

/* 从 XML 中 获 取 UI 元 素 对 象 */<br />

show = (TextView) findViewById(R.id.TextView_InputShow);<br />

autoTextView =<br />

(AutoCompleteTextView) findViewById(R.id.AutoCompleteTextView_input);<br />

clean = (Button) findViewById(R.id.Button_clean);<br />

/* 实 现 一 个 适 配 器 对 象 , 用 来 给 自 动 完 成 输 入 框 添 加 自 动 装 入 的 内 容 */<br />

arrayAdapter = new ArrayAdapter(this<br />

this,<br />

android.R.layout.simple_dropdown_item_1line, normalString);<br />

/* 给 自 动 完 成 输 入 框 添 加 内 容 适 配 器 */<br />

autoTextView.setAdapter(arrayAdapter);<br />

/* 给 清 空 按 钮 添 加 点 击 事 件 处 理 监 听 器 */<br />

30


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

}<br />

}<br />

clean.setOnClickListener(new<br />

new Button.OnClickListener() {<br />

});<br />

@Override<br />

public void onClick(View v) {<br />

// TODO Auto-generated method stub<br />

}<br />

/* 清 空 */<br />

autoTextView.setText("");<br />

4<br />

结 果<br />

31


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

MultiAutoCompleteTextView 与 数 组<br />

1<br />

新 建 工 程<br />

2 修 改 main.xml 布 局 , 添 加 一 个 TextView、 一 个 MultiAutoCompleteTextView、 一 个 Button<br />

<br />

<br />

<br />

<br />

<br />

<br />

3<br />

MultiAutoCompleteTextView 是 可 以 自 动 完 成 用 户 输 入 , 能 够 添 加 多 个 输 入 , 注 意 设 置 Tokenizer<br />

/* 设 置 Tokenizer 来 确 定 用 户 输 入 文 本 的 相 关 范 围 */<br />

myAutoCompleteTextView<br />

.setTokenizer(new<br />

new MultiAutoCompleteTextView.CommaTokenizer());<br />

32


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

4 修 改 mainActivity.java, 实 现 动 态 自 动 完 成 用 户 输 入 相 关 内 容<br />

package zyf.Ex_Ctrl_13_B;<br />

/* 导 入 使 用 的 包 */<br />

import android.app.Activity;<br />

import android.os.Bundle;<br />

import android.view.View;<br />

import android.widget.ArrayAdapter;<br />

import android.widget.Button;<br />

import android.widget.MultiAutoCompleteTextView;<br />

public class Ex_Ctrl_13_B extends Activity {<br />

/** Called when the activity is first created. */<br />

/* 定 义 要 使 用 的 类 对 象 */<br />

private String[] normalString =<br />

new String[] {<br />

"<strong>Android</strong>", "<strong>Android</strong> Blog","<strong>Android</strong> Market", "<strong>Android</strong> SDK",<br />

"<strong>Android</strong> AVD","BlackBerry","BlackBerry JDE", "Symbian",<br />

"Symbian Carbide", "Java 2ME","Java FX", "Java 2EE",<br />

"Java 2SE", "Mobile", "Motorola", "Nokia", "Sun",<br />

"Nokia Symbian", "Nokia forum", "WindowsMobile", "Broncho",<br />

"Windows XP", "Google", "Google <strong>Android</strong> ", "Google 浏 览 器 ",<br />

"IBM", "MicroSoft", "Java", "C++", "C", "C#", "J#", "VB" };<br />

private Button clean;<br />

private MultiAutoCompleteTextView myAutoCompleteTextView;<br />

private ArrayAdapter adapter;<br />

@Override<br />

public void onCreate(Bundle savedInstanceState) {<br />

super.onCreate(savedInstanceState);<br />

/* 装 入 主 屏 布 局 main.xml */<br />

setContentView(R.layout.main);<br />

/* 以 findViewById() 从 XML 中 获 取 UI 元 素 对 象 */<br />

myAutoCompleteTextView =<br />

(MultiAutoCompleteTextView) findViewById(R.id.MultiAutoCompleteTextView);<br />

clean = (Button) findViewById(R.id.Button_clean);<br />

/* new ArrayAdapter 对 象 并 将 normalString 字 符 串 数 组 传 入 */<br />

/* 实 现 一 个 适 配 器 对 象 , 用 来 给 自 动 完 成 输 入 框 添 加 自 动 装 入 的 内 容 */<br />

adapter = new ArrayAdapter(this<br />

this,<br />

android.R.layout.simple_dropdown_item_1line, normalString);<br />

/* 将 ArrayAdapter 添 加 AutoCompleteTextView 对 象 中 */<br />

/* 给 自 动 完 成 输 入 框 添 加 内 容 适 配 器 */<br />

myAutoCompleteTextView.setAdapter(adapter);<br />

/* 设 置 Tokenizer 来 确 定 用 户 输 入 文 本 的 相 关 范 围 */<br />

myAutoCompleteTextView<br />

33


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

}<br />

}<br />

.setTokenizer(new<br />

new MultiAutoCompleteTextView.CommaTokenizer());<br />

/* 给 清 空 按 钮 添 加 点 击 事 件 处 理 监 听 器 */<br />

clean.setOnClickListener(new<br />

new Button.OnClickListener() {<br />

});<br />

@Override<br />

public void onClick(View v) {<br />

// TODO Auto-generated method stub<br />

}<br />

/* 清 空 */<br />

myAutoCompleteTextView.setText("");<br />

5<br />

结 果<br />

34


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

模 拟 / 数 字 / 线 程 小 时 钟 设 计<br />

AnalogClock 与 DigitalClock 的 原 理 -- 线 程 时 钟 实 现<br />

1<br />

新 建 工 程<br />

2 修 改 man.xml 布 局 , 添 加 一 个 AnalogClock、 一 个 DigitalClock、 一 个 TextView<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

android:layout_y="46px"><br />

<br />

<br />

<br />

<br />

<br />

<br />

3<br />

模 拟 时 钟 的 实 现 不 需 要 额 外 代 码 , 只 需 要 UI 中 添 加 , 其 自 动 显 示 时 间<br />

/* 定 义 模 拟 时 钟 对 象 */<br />

AnalogClock myClock;<br />

/* 从 XML 中 获 取 模 拟 时 钟 UI 对 象 */<br />

myClock=(AnalogClock)findViewById(R.id.Clock);<br />

4<br />

数 字 时 钟 的 实 现 也 不 需 要 额 外 代 码 , 只 需 要 UI 中 添 加 , 其 自 动 显 示 时 间<br />

/* 定 义 数 字 时 钟 对 象 */<br />

DigitalClock myDigClock;<br />

/* 从 XML 中 获 取 数 字 时 钟 UI 对 象 */<br />

myDigClock=(DigitalClock)findViewById(R.id.DigitalClock01);<br />

5 而 使 用 线 程 实 现 的 TextView 时 钟 则 需 要 线 程 Thread、Handler( 发 送 、 处 理 消 息 ) 辅 助 实 现<br />

import android.os.Handler;<br />

import android.os.Message;<br />

public class Clock extends Activity implements Runnable{<br />

public Handler myHandler;<br />

@Override<br />

protected void onCreate(Bundle savedInstanceState) {<br />

// TODO Auto-generated method stub<br />

super.onCreate(savedInstanceState);<br />

setContentView(R.layout.gh);<br />

myHandler = new Handler() {<br />

@Override<br />

36


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

}<br />

public void handleMessage(Message msg) {<br />

// TODO Auto-generated method stub<br />

}<br />

};<br />

Thread myT = new Thread(this<br />

this);<br />

myT.start();<br />

}<br />

@Override<br />

public void run() {<br />

// TODO Auto-generated method stub<br />

}<br />

6 修 改 mianActivity.java, 实 现 线 程 控 制 , 以 及 模 拟 / 数 字 时 钟 的 实 现<br />

package zyf.three.clock;<br />

/* 导 入 要 使 用 的 包 */<br />

import java.util.Calendar;<br />

import android.app.Activity;<br />

import android.os.Bundle;<br />

import android.os.Handler;<br />

import android.os.Message;<br />

import android.widget.AnalogClock;<br />

import android.widget.DigitalClock;<br />

import android.widget.TextView;<br />

public class Clock extends Activity implements Runnable {<br />

/* 定 义 要 使 用 的 类 对 象 */<br />

private TextView showTime;// 显 示 进 程 时 钟 的 TextView<br />

AnalogClock myClock;// 模 拟 时 钟<br />

DigitalClock myDigClock;// 数 字 时 钟<br />

private final int msg_Key = 0x1234;// 发 送 的 消 息 内 容<br />

public Handler myHandler;// 发 送 、 处 理 消 息 的 类<br />

public Calendar myCalendar;// 日 历 类<br />

private int my_Hour, my_Minute, my_Second;// 时 、 分 、 秒<br />

private Thread myT;<br />

@Override<br />

protected void onCreate(Bundle savedInstanceState) {<br />

// TODO Auto-generated method stub<br />

super.onCreate(savedInstanceState);<br />

/* 导 入 主 屏 布 局 main.xml */<br />

setContentView(R.layout.gh);<br />

/* 从 XML 中 获 取 模 拟 时 钟 UI 对 象 */<br />

37


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

myClock = (AnalogClock) findViewById(R.id.Clock);<br />

/* 从 XML 中 获 取 数 字 时 钟 UI 对 象 */<br />

myDigClock = (DigitalClock) findViewById(R.id.DigitalClock01);<br />

/* 从 XML 中 获 取 TextView UI 对 象 */<br />

showTime = (TextView) findViewById(R.id.TextView_showTime);<br />

/* 通 过 Handler 来 接 收 进 程 所 传 递 的 信 息 并 更 新 TextView */<br />

myHandler = new Handler() {<br />

@Override<br />

public void handleMessage(Message msg) {<br />

/* 这 里 是 处 理 信 息 的 方 法 */<br />

// TODO Auto-generated method stub<br />

super.handleMessage(msg);<br />

switch (msg.what) {<br />

case msg_Key:<br />

/* 在 这 处 理 要 TextView 对 象 Show 时 间 的 事 件 */<br />

showTime.setText(my_Hour + " : " + my_Minute + " : "<br />

+ my_Second);<br />

break;<br />

}<br />

default:<br />

break;<br />

}<br />

}<br />

};<br />

/* 通 过 进 程 来 持 续 取 得 系 统 时 间 */<br />

myT = new Thread(this<br />

this);<br />

myT.start();<br />

/* 实 现 一 个 Runable 接 口 , 实 例 化 一 个 进 程 对 象 , 用 来 持 续 取 得 系 统 时 间 */<br />

@Override<br />

public void run() {<br />

// TODO Auto-generated method stub<br />

try {<br />

do {<br />

/* 取 得 系 统 时 间 */<br />

long Time = System.currentTimeMillis();<br />

myCalendar = Calendar.getInstance();<br />

myCalendar.setTimeInMillis(Time);<br />

my_Hour = myCalendar.get(Calendar.HOUR);<br />

my_Minute = myCalendar.get(Calendar.MINUTE);<br />

my_Second = myCalendar.get(Calendar.SECOND);<br />

/* 让 进 程 休 息 一 秒 */<br />

Thread.sleep(1000);<br />

38


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

}<br />

}<br />

/* 重 要 关 键 程 序 : 取 得 时 间 后 发 出 信 息 给 Handler */<br />

Message msg = new Message();<br />

msg.what = msg_Key;<br />

myHandler.sendMessage(msg);<br />

/* 重 要 关 键 程 序 : 取 得 时 间 后 发 出 信 息 给 Handler */<br />

} while (myT.interrupted() == false);<br />

/* 当 系 统 发 出 中 断 信 息 时 停 止 本 循 环 */<br />

} catch (InterruptedException e) {<br />

// TODO Auto-generated catch block<br />

e.printStackTrace();<br />

}<br />

7<br />

结 果<br />

39


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

动 态 输 入 日 期 与 时 间<br />

DatePicker 与 TimePicker 应 用<br />

1<br />

新 建 工 程<br />

2 修 改 main.xml 布 局 , 添 加 一 个 DatePicker、 一 个 TimePicker、 一 个 TextView<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

3<br />

DatePicker 的 初 始 化 与 日 期 改 变 事 件 的 处 理<br />

/* 定 义 程 序 用 到 的 UI 元 素 对 象 : 日 历 设 置 器 */<br />

DatePicker my_datePicker;<br />

/* findViewById() 从 XML 中 获 取 UI 元 素 对 象 */<br />

my_datePicker = (DatePicker) findViewById(R.id.my_DatePicker);<br />

40


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

/* 为 日 历 设 置 器 添 加 点 击 事 件 监 听 器 , 处 理 设 置 日 期 事 件 */<br />

my_datePicker.init(my_Year, my_Month, my_Day,<br />

new DatePicker.OnDateChangedListener(){<br />

});<br />

@Override<br />

public void onDateChanged(DatePicker view, int year,<br />

int monthOfYear, int dayOfMonth) {<br />

// TODO Auto-generated method stub<br />

}<br />

/* 日 期 改 变 事 件 处 理 */<br />

4<br />

TimePicker 的 初 始 化 与 时 间 改 变 事 件 的 处 理<br />

/* 定 义 程 序 用 到 的 UI 元 素 对 象 : 时 间 设 置 器 */<br />

TimePicker my_timePicker;<br />

/* findViewById() 从 XML 中 获 取 UI 元 素 对 象 */<br />

my_timePicker = (TimePicker) findViewById(R.id.my_TimePicker);<br />

/* 把 时 间 设 置 成 24 小 时 制 */<br />

my_timePicker.setIs24HourView(true<br />

true);<br />

/* 为 时 间 设 置 器 添 加 点 击 事 件 监 听 器 , 处 理 设 置 时 间 事 件 */<br />

my_timePicker.setOnTimeChangedListener(new<br />

new<br />

});<br />

TimePicker.OnTimeChangedListener(){<br />

@Override<br />

public void onTimeChanged(TimePicker view, int hourOfDay,<br />

int minute) {<br />

// TODO Auto-generated method stub<br />

}<br />

/* 时 间 改 变 事 件 处 理 */<br />

5 修 改 mainActivity.java, 添 加 动 态 修 改 时 间 并 显 示 效 果<br />

package zyf.Ex_Ctrl_15ME;<br />

/* 导 入 要 使 用 的 包 */<br />

import java.util.Calendar;<br />

import java.util.Locale;<br />

import android.app.Activity;<br />

import android.os.Bundle;<br />

import android.widget.DatePicker;<br />

import android.widget.TextView;<br />

import android.widget.TimePicker;<br />

public class Ex_Ctrl_15ME extends Activity {<br />

/** Called when the activity is first created. */<br />

/* 定 义 时 间 变 量 : 年 、 月 、 日 、 小 时 、 分 钟 */<br />

int my_Year;<br />

int my_Month;<br />

41


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

int my_Day;<br />

int my_Hour;<br />

int my_Minute;<br />

/* 定 义 程 序 用 到 的 UI 元 素 对 象 : 日 历 设 置 器 、 时 间 设 置 器 、 显 示 时 间 的 TextView */<br />

DatePicker my_datePicker;<br />

TimePicker my_timePicker;<br />

TextView showDate_Time;<br />

/* 定 义 日 历 对 象 , 初 始 化 时 , 用 来 获 取 当 前 时 间 */<br />

Calendar my_Calendar;<br />

@Override<br />

public void onCreate(Bundle savedInstanceState) {<br />

/* 从 Calendar 抽 象 基 类 获 得 实 例 对 象 , 并 设 置 成 中 国 时 区 */<br />

my_Calendar = Calendar.getInstance(Locale.CHINA);<br />

/* 从 日 历 对 象 中 获 取 当 前 的 : 年 、 月 、 日 、 时 、 分 */<br />

my_Year = my_Calendar.get(Calendar.YEAR);<br />

my_Month = my_Calendar.get(Calendar.MONTH);<br />

my_Day = my_Calendar.get(Calendar.DAY_OF_MONTH);<br />

my_Hour = my_Calendar.get(Calendar.HOUR_OF_DAY);<br />

my_Minute = my_Calendar.get(Calendar.MINUTE);<br />

super.onCreate(savedInstanceState);<br />

setContentView(R.layout.main);<br />

/* findViewById() 从 XML 中 获 取 UI 元 素 对 象 */<br />

my_datePicker = (DatePicker) findViewById(R.id.my_DatePicker);<br />

my_timePicker = (TimePicker) findViewById(R.id.my_TimePicker);<br />

showDate_Time = (TextView) findViewById(R.id.my_TextView);<br />

/* 把 时 间 设 置 成 24 小 时 制 */<br />

my_timePicker.setIs24HourView(true<br />

true);<br />

/* 显 示 时 间 */<br />

loadDate_Time();<br />

/* 为 日 历 设 置 器 添 加 点 击 事 件 监 听 器 , 处 理 设 置 日 期 事 件 */<br />

my_datePicker.init(my_Year, my_Month, my_Day,<br />

new DatePicker.OnDateChangedListener(){<br />

});<br />

@Override<br />

public void onDateChanged(DatePicker view, int year,<br />

int monthOfYear, int dayOfMonth) {<br />

// TODO Auto-generated method stub<br />

}<br />

/* 把 设 置 改 动 后 的 日 期 赋 值 给 我 的 日 期 对 象 */<br />

my_Year=year;<br />

my_Month=monthOfYear;<br />

my_Day=dayOfMonth;<br />

/* 动 态 显 示 修 改 后 的 日 期 */<br />

loadDate_Time();<br />

42


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

}<br />

}<br />

/* 为 时 间 设 置 器 添 加 点 击 事 件 监 听 器 , 处 理 设 置 时 间 事 件 */<br />

my_timePicker.setOnTimeChangedListener(new<br />

new<br />

});<br />

TimePicker.OnTimeChangedListener(){<br />

@Override<br />

public void onTimeChanged(TimePicker view, int hourOfDay,<br />

int minute) {<br />

}<br />

/* 把 设 置 改 动 后 的 时 间 赋 值 给 我 的 时 间 对 象 */<br />

my_Hour=hourOfDay;<br />

my_Minute=minute;<br />

/* 动 态 显 示 修 改 后 的 时 间 */<br />

loadDate_Time();<br />

/* 设 置 显 示 日 期 时 间 的 方 法 */<br />

private void loadDate_Time() {<br />

showDate_Time.setText(new<br />

StringBuffer()<br />

}<br />

.append(my_Year).append("/")<br />

.append(FormatString(my_Month + 1))<br />

.append("/").append(FormatString(my_Day))<br />

.append("<br />

").append(FormatString(my_Hour))<br />

.append(" : ").append(FormatString(my_Minute)));<br />

/* 日 期 时 间 显 示 两 位 数 的 方 法 */<br />

private String FormatString(int<br />

int x) {<br />

}<br />

String s = Integer.toString(x);<br />

if (s.length() == 1) {<br />

s = "0" + s;<br />

}<br />

return s;<br />

6<br />

结 果<br />

43


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

DatePickerDialog 与 TimePickerDialog 应 用<br />

1<br />

新 建 工 程<br />

2 修 改 main.xml 布 局 , 添 加 两 个 按 钮 、 一 个 TextView<br />

<br />

<br />

<br />

<br />

<br />

<br />

3<br />

DatePickerDialog 的 定 义 与 初 始 化 以 及 显 示<br />

/* 定 义 程 序 用 到 的 UI 元 素 对 象 : 日 历 设 置 器 对 话 框 */<br />

DatePickerDialog my_datePickerDialog;<br />

/* 构 造 一 个 DatePickerDialog 对 象 , 第 一 个 参 数 为 Context、<br />

* 第 二 参 数 为 日 期 修 改 事 件 处 理 监 听 器 、 后 面 为 初 始 化 的 年 月 日 */<br />

my_datePickerDialog=new<br />

DatePickerDialog(Ex_Ctrl_15_B.this<br />

this,<br />

/* 显 示 出 日 期 设 置 对 话 框 */<br />

my_datePickerDialog.show();<br />

myDateSetListener, my_Year, my_Month, my_Day);<br />

44


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

4 DatePickerDialog 的 日 期 修 改 事 件 处 理<br />

/* 日 期 改 变 设 置 事 件 监 听 器 */<br />

private OnDateSetListener myDateSetListener=new<br />

new OnDateSetListener(){<br />

@Override<br />

public void onDateSet(DatePicker view, int year, int monthOfYear,<br />

int dayOfMonth) {<br />

// TODO Auto-generated method stub<br />

/* 日 期 改 变 设 置 事 件 处 理 */<br />

}<br />

};<br />

5<br />

TimePickerDialog 的 定 义 与 初 始 化 以 及 显 示<br />

/* 定 义 程 序 用 到 的 UI 元 素 对 象 : 时 间 设 置 器 对 话 框 */<br />

TimePickerDialog my_timePickerDialog;<br />

/* 构 造 一 个 TimePickerDialog 对 象 , 第 一 个 参 数 为 Context、<br />

* 第 二 个 参 数 为 时 间 修 改 事 件 监 听 器 、 后 面 两 个 为 初 始 化 时 间 ,<br />

* 最 后 一 个 boolean 类 型 设 置 是 否 为 24 小 时 制 */<br />

my_timePickerDialog=new<br />

TimePickerDialog(Ex_Ctrl_15_B.this<br />

this,<br />

myTimeSetListener, my_Hour, my_Minute, false);<br />

/* 显 示 出 日 期 设 置 对 话 框 */<br />

my_timePickerDialog.show();<br />

6 TimePickerDialog 的 时 间 修 改 事 件 处 理<br />

/* 时 间 改 变 设 置 事 件 监 听 器 */<br />

private OnTimeSetListener myTimeSetListener=new<br />

new OnTimeSetListener(){<br />

@Override<br />

public void onTimeSet(TimePicker view, int hourOfDay, int minute) {<br />

// TODO Auto-generated method stub<br />

/* 时 间 改 变 设 置 事 件 处 理 */<br />

}<br />

};<br />

7 修 改 mainActivity.java, 实 现 动 态 显 示 修 改 的 日 期 、 时 间<br />

package zyf.Ex_Ctrl_15_B;<br />

/* 导 入 使 用 的 包 */<br />

import java.util.Calendar;<br />

import java.util.Locale;<br />

import android.app.Activity;<br />

import android.app.DatePickerDialog;<br />

import android.app.TimePickerDialog;<br />

import android.app.DatePickerDialog.OnDateSetListener;<br />

import android.app.TimePickerDialog.OnTimeSetListener;<br />

import android.os.Bundle;<br />

import android.view.View;<br />

45


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

import android.widget.Button;<br />

import android.widget.DatePicker;<br />

import android.widget.TextView;<br />

import android.widget.TimePicker;<br />

public class Ex_Ctrl_15_B extends Activity implements Button.OnClickListener{<br />

/** Called when the activity is first created. */<br />

/* 定 义 时 间 变 量 : 年 、 月 、 日 、 小 时 、 分 钟 */<br />

int my_Year;<br />

int my_Month;<br />

int my_Day;<br />

int my_Hour;<br />

int my_Minute;<br />

/* 定 义 程 序 用 到 的 UI 元 素 对 象 : 日 历 设 置 器 对 话 框 、 时 间 设 置 器 对 话 框 、<br />

显 示 时 间 的 TextView、 按 钮 */<br />

DatePickerDialog my_datePickerDialog;<br />

TimePickerDialog my_timePickerDialog;<br />

TextView showDate_Time;<br />

Button showDatePDialog;<br />

Button showTimePDialog;<br />

/* 定 义 日 历 对 象 , 初 始 化 时 , 用 来 获 取 当 前 时 间 */<br />

Calendar my_Calendar;<br />

/* 日 期 改 变 设 置 事 件 监 听 器 */<br />

private OnDateSetListener myDateSetListener=new<br />

new OnDateSetListener(){<br />

};<br />

@Override<br />

public void onDateSet(DatePicker view, int year,<br />

int monthOfYear,<br />

// TODO Auto-generated method stub<br />

}<br />

/* 把 设 置 修 改 后 的 日 期 赋 值 给 我 的 年 、 月 、 日 变 量 */<br />

my_Year=year;<br />

my_Month=monthOfYear;<br />

my_Day=dayOfMonth;<br />

/* 显 示 设 置 后 的 日 期 */<br />

loadDate_Time();<br />

int dayOfMonth) {<br />

/* 时 间 改 变 设 置 事 件 监 听 器 */<br />

private OnTimeSetListener myTimeSetListener=new<br />

new OnTimeSetListener(){<br />

@Override<br />

public void onTimeSet(TimePicker view, int hourOfDay, int minute) {<br />

// TODO Auto-generated method stub<br />

/* 把 设 置 修 改 后 的 时 间 赋 值 给 我 的 时 、 分 变 量 */<br />

my_Hour=hourOfDay;<br />

my_Minute=minute;<br />

46


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

};<br />

}<br />

/* 显 示 设 置 后 的 时 间 */<br />

loadDate_Time();<br />

@Override<br />

public void onCreate(Bundle savedInstanceState) {<br />

}<br />

/* 从 Calendar 抽 象 基 类 获 得 实 例 对 象 , 并 设 置 成 中 国 时 区 */<br />

my_Calendar = Calendar.getInstance(Locale.CHINA);<br />

/* 从 日 历 对 象 中 获 取 当 前 的 : 年 、 月 、 日 、 时 、 分 */<br />

my_Year = my_Calendar.get(Calendar.YEAR);<br />

my_Month = my_Calendar.get(Calendar.MONTH);<br />

my_Day = my_Calendar.get(Calendar.DAY_OF_MONTH);<br />

my_Hour = my_Calendar.get(Calendar.HOUR_OF_DAY);<br />

my_Minute = my_Calendar.get(Calendar.MINUTE);<br />

super.onCreate(savedInstanceState);<br />

setContentView(R.layout.main);<br />

/* findViewById() 从 XML 中 获 取 UI 元 素 对 象 */<br />

showDate_Time = (TextView) findViewById(R.id.my_TextView);<br />

showDatePDialog=(Button)findViewById(R.id.show_DatePicker);<br />

showTimePDialog=(Button)findViewById(R.id.show_TimePicker);<br />

/* 显 示 当 前 时 间 */<br />

loadDate_Time();<br />

/* 为 按 钮 添 加 点 击 事 件 监 听 器 */<br />

showDatePDialog.setOnClickListener(this<br />

this);<br />

showTimePDialog.setOnClickListener(this<br />

this);<br />

/* 设 置 显 示 日 期 时 间 的 方 法 */<br />

private void loadDate_Time() {<br />

// TODO Auto-generated method stub<br />

showDate_Time.setText(new<br />

StringBuffer()<br />

}<br />

.append(my_Year).append("/")<br />

.append(FormatString(my_Month + 1))<br />

.append("/").append(FormatString(my_Day))<br />

.append("<br />

").append(FormatString(my_Hour))<br />

.append(" : ").append(FormatString(my_Minute)));<br />

/* 日 期 时 间 显 示 两 位 数 的 方 法 */<br />

private String FormatString(int<br />

int x) {<br />

}<br />

String s = Integer.toString(x);<br />

if (s.length() == 1) {<br />

s = "0" + s;<br />

}<br />

return s;<br />

47


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

@Override<br />

public void onClick(View v) {<br />

// TODO Auto-generated method stub<br />

switch (v.getId()) {<br />

case R.id.show_DatePicker:<br />

/* 显 示 日 期 设 置 对 话 框 的 按 钮 点 击 事 件 处 理 */{<br />

/* 构 造 一 个 DatePickerDialog 对 象 , 第 一 个 参 数 为 Context、<br />

第 二 参 数 为 日 期 修 改 事 件 处 理 监 听 器 、 后 面 为 初 始 化 的 年 月 日 */<br />

my_datePickerDialog=new<br />

DatePickerDialog(Ex_Ctrl_15_B.this<br />

this,<br />

/* 显 示 出 日 期 设 置 对 话 框 */<br />

my_datePickerDialog.show();<br />

}<br />

break;<br />

case R.id.show_TimePicker:<br />

/* 显 示 时 间 设 置 对 话 框 的 按 钮 点 击 事 件 处 理 */{<br />

myDateSetListener, my_Year, my_Month, my_Day);<br />

/* 构 造 一 个 TimePickerDialog 对 象 , 第 一 个 参 数 为 Context、 第 二 个 参 数 为 时 间 修 改<br />

事 件 监 听 器 、 后 面 两 个 为 初 始 化 时 间 , 最 后 一 个 boolean 类 型 设 置 是 否 为 24 小 时 制 */<br />

my_timePickerDialog=new<br />

TimePickerDialog(Ex_Ctrl_15_B.this<br />

this,<br />

myTimeSetListener, my_Hour, my_Minute, false);<br />

}<br />

}<br />

}<br />

break;<br />

default:<br />

break;<br />

}<br />

/* 显 示 出 日 期 设 置 对 话 框 */<br />

my_timePickerDialog.show();<br />

8<br />

结 果<br />

48


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

GridView 宫 格 视 图 实 践<br />

BaseAdapter 与 GridView<br />

1<br />

新 建 工 程<br />

2<br />

在 res/drawable 目 录 下 添 加 名 称 为 a.png---p.png 的 图 片<br />

3 修 改 main.xml 布 局 , 添 加 一 个 GridView、 一 个 ImageView<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

4<br />

GridView 的 定 义 与 实 例 化<br />

/* 定 义 类 对 象 */<br />

private GridView my_gridview;<br />

/* 从 xml 中 获 取 UI 资 源 对 象 */<br />

my_gridview = (GridView) findViewById(R.id.grid);<br />

49


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

5<br />

GridView 的 图 像 内 容 设 置 与 ImageAdapter<br />

/* 新 建 一 个 自 定 义 的 ImageAdapter*/<br />

myImageViewAdapter = new ImageAdapter(this<br />

this);<br />

/* 为 GridView 对 象 设 置 一 个 ImageAdapter*/<br />

my_gridview.setAdapter(myImageViewAdapter);<br />

6 内 部 类 ImageAdapter, 实 现 了 BaseAdapter<br />

private class myImageAdapter extends BaseAdapter{<br />

@Override<br />

public int getCount() {<br />

// TODO Auto-generated method stub<br />

return 0;<br />

}<br />

@Override<br />

public Object getItem(int<br />

position) {<br />

// TODO Auto-generated method stub<br />

return null;<br />

}<br />

@Override<br />

public long getItemId(int<br />

position) {<br />

// TODO Auto-generated method stub<br />

return 0;<br />

}<br />

@Override<br />

public View getView(int<br />

int position,<br />

View convertView, ViewGroup parent) {<br />

// TODO Auto-generated method stub<br />

return null;<br />

}<br />

}<br />

7 GridView 的 图 片 Items 点 击 事 件 处 理<br />

/* 为 GridView 添 加 图 片 Items 点 击 事 件 监 听 器 */<br />

my_gridview.setOnItemClickListener(this<br />

this);<br />

@Override<br />

public void onItemClick(AdapterView arg0,<br />

View arg1, int arg2, long arg3) {<br />

// TODO Auto-generated method stub<br />

/* 点 击 GridView 中 图 片 Items 事 件 处 理 */<br />

}<br />

50


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

8<br />

GridView 移 动 后 选 中 图 片 Items 的 事 件 处 理<br />

/* 为 GridView 添 加 图 片 Items 移 动 选 中 事 件 监 听 器 */<br />

my_gridview.setOnItemSelectedListener(this<br />

this);<br />

@Override<br />

public void onItemSelected(AdapterView arg0,<br />

View arg1, int arg2,long<br />

arg3) {<br />

// TODO Auto-generated method stub<br />

}<br />

/*GridView 中 的 图 片 移 动 焦 点 选 中 时 事 件 处 理 */<br />

/* 未 选 中 GridView 中 的 图 片 Items 事 件 处 理 */<br />

@Override<br />

public void onNothingSelected(AdapterView arg0) {<br />

// TODO Auto-generated method stub<br />

}<br />

9 修 改 mainActivity.java 来 实 现 图 片 点 击 和 图 片 移 动 选 中 的 效 果<br />

package zyf.GridViewTest;<br />

/* 导 入 要 使 用 的 包 */<br />

import android.app.Activity;<br />

import android.app.AlertDialog;<br />

import android.content.Context;<br />

import android.content.DialogInterface;<br />

import android.content.DialogInterface.OnClickListener;<br />

import android.os.Bundle;<br />

import android.view.View;<br />

import android.view.ViewGroup;<br />

import android.widget.AdapterView;<br />

import android.widget.BaseAdapter;<br />

import android.widget.GridView;<br />

import android.widget.ImageView;<br />

public class GridViewTest extends Activity implements<br />

GridView.OnItemClickListener,<br />

GridView.OnItemSelectedListener {<br />

/** Called when the activity is first created. */<br />

/* 定 义 类 对 象 */<br />

private GridView my_gridview;<br />

private ImageView big_imageView;<br />

private ImageAdapter myImageViewAdapter;<br />

/* 内 部 类 , 实 现 一 个 图 片 适 配 器 */<br />

public class ImageAdapter extends BaseAdapter {<br />

/*myContext 为 上 下 文 */<br />

private Context myContext;<br />

/*GridView 用 来 加 载 图 片 的 ImageView*/<br />

private ImageView the_imageView;<br />

51


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

// 这 是 图 片 资 源 ID 的 数 组<br />

private Integer[] mImageIds = {<br />

R.drawable.a, R.drawable.b,R.drawable.c, R.drawable.d,<br />

R.drawable.e, R.drawable.f,R.drawable.g, R.drawable.h,<br />

R.drawable.i, R.drawable.j,R.drawable.k, R.drawable.l,<br />

R.drawable.m, R.drawable.n,R.drawable.o, R.drawable.p<br />

};<br />

/* 构 造 方 法 */<br />

public ImageAdapter(Context myContext) {<br />

// TODO Auto-generated constructor stub<br />

this.myContext = myContext;<br />

}<br />

/* 传 入 一 个 Context, 本 例 中 传 入 的 是 GridViewTest */<br />

/* 返 回 资 源 ID 数 组 长 度 */<br />

@Override<br />

public int getCount() {<br />

// TODO Auto-generated method stub<br />

return mImageIds.length;<br />

}<br />

/* 得 到 Item*/<br />

@Override<br />

public Object getItem(int<br />

position) {<br />

// TODO Auto-generated method stub<br />

return position;<br />

}<br />

/* 获 取 Items 的 ID*/<br />

@Override<br />

public long getItemId(int<br />

position) {<br />

// TODO Auto-generated method stub<br />

return position;<br />

}<br />

/* 获 取 要 显 示 的 View 对 象 */<br />

@Override<br />

public View getView(int<br />

int position,<br />

View convertView, ViewGroup parent) {<br />

// TODO Auto-generated method stub<br />

/* 创 建 一 个 ImageView*/<br />

the_imageView = new ImageView(myContext);<br />

// 设 置 图 像 源 于 资 源 ID。<br />

the_imageView.setImageResource(mImageIds[position]);<br />

/* 使 ImageView 与 边 界 适 应 */<br />

the_imageView.setAdjustViewBounds(true<br />

true);<br />

52


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

}<br />

}<br />

/* 设 置 背 景 图 片 的 风 格 */<br />

the_imageView.setBackgroundResource(<br />

/* 返 回 带 有 多 个 图 片 ID 的 ImageView*/<br />

return the_imageView;<br />

android.R.drawable.picture_frame);<br />

/* 自 定 义 获 取 对 应 位 置 的 图 片 ID*/<br />

public Integer getcheckedImageIDPostion(int<br />

int theindex) {<br />

return mImageIds[theindex];<br />

}<br />

@Override<br />

public void onCreate(Bundle savedInstanceState) {<br />

super.onCreate(savedInstanceState);<br />

}<br />

/* 设 置 主 屏 布 局 */<br />

setContentView(R.layout.main);<br />

/* 从 xml 中 获 取 UI 资 源 对 象 */<br />

my_gridview = (GridView) findViewById(R.id.grid);<br />

big_imageView =<br />

(ImageView) findViewById(R.id.ImageView_Big);<br />

/* 新 建 一 个 自 定 义 的 ImageAdapter*/<br />

myImageViewAdapter = new ImageAdapter(this<br />

this);<br />

/* 为 GridView 对 象 设 置 一 个 ImageAdapter*/<br />

my_gridview.setAdapter(myImageViewAdapter);<br />

/* 为 GridView 添 加 图 片 Items 点 击 事 件 监 听 器 */<br />

my_gridview.setOnItemClickListener(this<br />

this);<br />

/* 为 GridView 添 加 图 片 Items 移 动 选 中 事 件 监 听 器 */<br />

my_gridview.setOnItemSelectedListener(this<br />

this);<br />

@Override<br />

public void onItemClick(AdapterView arg0,<br />

View arg1, int arg2, long arg3) {<br />

/* 点 击 GridView 中 图 片 Items 后 显 示 一 个 AlterDialog 提 示 框 */<br />

new AlertDialog.Builder(this<br />

this)<br />

.setTitle(" 图 片 浏 览 ")<br />

/* 获 得 对 应 的 图 片 并 显 示 */<br />

.setIcon(myImageViewAdapter.getcheckedImageIDPostion(arg2))<br />

/* 添 加 一 个 按 钮 */<br />

.setPositiveButton(" 返 回 ", new OnClickListener() {<br />

@Override<br />

public void onClick(DialogInterface dialog,<br />

int which) {<br />

}<br />

/* 显 示 提 示 框 */<br />

53


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

}<br />

}<br />

}).show();<br />

@Override<br />

public void onItemSelected(AdapterView arg0,<br />

View arg1, int arg2,long<br />

arg3) {<br />

// TODO Auto-generated method stub<br />

}<br />

/*GridView 中 的 图 片 移 动 焦 点 选 中 时 ,<br />

* 下 面 的 大 图 ImageView 显 示 相 应 的 大 图 片 */<br />

big_imageView.setImageResource(myImageViewAdapter<br />

.getcheckedImageIDPostion(arg2));<br />

/* 未 选 中 GridView 中 的 图 片 Items 事 件 处 理 */<br />

@Override<br />

public void onNothingSelected(AdapterView arg0) {<br />

// TODO Auto-generated method stub<br />

}<br />

10<br />

结 果<br />

54


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

封 面<br />

55


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

封 面<br />

1


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

GUI 可 视 化 设 计 器 ——DroidDraw<br />

DroidDraw 是 一 个 基 于 Java Swing 的 <strong>Android</strong> 界 面 设 计 器 , 可 以 通 过 它 来 生 成 复 杂 的 <strong>Android</strong> Layout XML 文<br />

件 ,<strong>Android</strong> 的 Layout 和 Swing Layout 中 有 很 好 的 对 应 , 设 计 器 的 代 码 编 写 起 来 比 较 容 易 。<br />

2


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

AnDroidDraw<br />

AnDroidDraw 是 一 个 与 DroidDraw 集 成 的 <strong>Android</strong> 应 用 程 序 , 它 允 许 你 从 DroidDraw 应 用 程 序 下 载 你 的 GUIs,<br />

也 允 许 你 在 一 个 <strong>Android</strong> 设 备 上 预 览 你 的 GUIs. 下 载 DroidDraw<br />

步 骤 零<br />

<br />

<br />

<br />

下 载 AnDroidDraw.apk<br />

使 用 :adb install AnDroidDraw.apk 把 它 安 装 到 你 的 <strong>Android</strong> 设 备 上<br />

安 装 一 个 端 口 转 发 规 则 :adb forward tcp:6100 tcp:7100<br />

步 骤 一<br />

在 你 的 <strong>Android</strong> 设 备 上 运 行 AnDroidDraw, 你 应 该 看 到 像 这 样 的 :<br />

步 骤 二<br />

在 你 的 电 脑 上 运 行 DroidDraw, 并 且 创 建 一 个 GUI,( 获 取 更 多 关 于 创 建 GUI 的 信 息 , 请 看 教 程 1、 教 程 2、<br />

教 程 3。) 接 下 来 从 DroidDraw 菜 单 中 选 择 "Project"->"Send GUI to Deviec"<br />

3


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

步 骤 三<br />

现 在 你 应 该 在 <strong>Android</strong> 屏 幕 上 看 到 你 新 创 建 的 GUI 的 像 这 样 的 xml:<br />

步 骤 四<br />

点 击 "Preview GUI" 按 钮 来 预 览 你 的 GUI。<br />

步 骤 五<br />

当 你 结 束 时 , 点 击 向 后 的 箭 头 , 来 返 回 到 AnDroidDraw 的 主 屏 幕 。<br />

记 住 , 如 果 你 感 兴 趣 , 你 可 以 在 文 本 框 中 编 辑 该 XML 文 件 , 并 且 再 次 点 击 "Preview GUI" 来 查 看 你 的 修 改 。<br />

然 而 , 这 些 修 改 将 不 会 返 回 到 DroidDraw。<br />

步 骤 六<br />

大 功 告 成 !??/Comments/Bugs brendan.d.burns 在 gmail 上 。<br />

4


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

DroidDraw 教 程 一 :Currency<br />

Converter<br />

步 骤 零<br />

本 教 程 将 给 你 一 个 简 短 的 介 绍 开 关 于 使 用 DroidDraw 用 户 界 面 设 计 器 来 开 发 一 个 在 <strong>Android</strong> 上 的 GUI 应 用 程<br />

序 。 本 教 程 假 设 你 已 经 下 载 并 安 装 了 <strong>Android</strong> SDK。 本 教 程 也 假 设 你 对 GUI 编 程 概 念 和 Java 编 程 语 言 相 当 熟<br />

悉 。<br />

步 骤 一<br />

登 陆 到 DroidDraw UI Designer<br />

步 骤 二<br />

设 置 根 布 局 为 RelativeLayout( 相 对 布 局 )<br />

步 骤 三<br />

选 择 "Layout" 标 签<br />

5


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

步 骤 四<br />

从 Layouts 面 板 中 把 一 个 LinearLayout 对 象 拖 放 到 屏 幕 顶 部 中 心 位 置<br />

步 骤 五<br />

选 择 该 LinearLayout 对 象 并 点 击 属 性 "Properties" 标 签 来 开 始 编 辑 layout 属 性 值 。 把 宽 度 "width" 改 成 "200px",<br />

高 度 "height" 改 成 "130px"<br />

点 击 "Apply" 来 应 用 改 变 。<br />

步 骤 六<br />

转 到 "Widgets" 标 签<br />

6


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

步 骤 七<br />

把 两 个 TextView 对 象 和 两 个 EditText 对 象 交 替 地 拖 放 到 LinearLayout 中<br />

步 骤 八<br />

把 一 个 RadioGroup 对 象 拖 放 进 LinearLayout 中 。 把 两 个 RadioButton 对 象 拖 放 到 RadioGroup 中 。<br />

7


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

步 骤 九<br />

把 一 个 Button 对 象 拖 放 到 根 RelativeLayout 中 , 它 在 LinearLayout 对 象 下 面 。 它 应 该 和 LinearLayout 的 右 边<br />

对 齐 。<br />

步 骤 十<br />

编 辑 每 个 TextView 对 象 的 属 性 值 。 上 面 一 个 的 文 本 设 置 成 "Dollars", 并 设 置 成 "bold" 字 体 样 式 。 下 面 一 个<br />

TextView 的 文 本 设 置 成 "Euros", 并 也 设 置 成 "bold" 字 体 样 式 。<br />

步 骤 十 一<br />

如 以 下 内 容 编 辑 上 面 一 个 EditText 的 属 性 值 :<br />

<br />

<br />

<br />

id 修 改 成 :"@+id/dollars"<br />

文 本 内 容 设 置 为 空<br />

宽 度 修 改 成 "100px"<br />

步 骤 十 一 半<br />

在 "Euros"TextView 下 面 的 第 二 个 EditText 上 重 复 步 骤 十 一 , 但 是 把 id 设 置 为 "@+id/euros"<br />

步 骤 十 二<br />

编 辑 第 一 个 RadioButton 属 性 : 文 本 设 置 为 "Dollars to Euros", 并 把 它 id 设 置 成 "@+id/dtoe"<br />

编 辑 第 二 个 RadioButton 属 性 : 文 本 设 置 为 "Euros to Dollars ", 并 把 它 id 设 置 成 "@+id/etod"<br />

8


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

重 要 注 意 事 项<br />

你 必 须 正 确 地 获 取 id, 因 为 这 是 你 在 代 码 中 如 何 获 取 搜 索 到 该 UI 元 素 的 方 式 。<br />

步 骤 十 三<br />

编 辑 Button 属 性 : 文 本 修 改 为 "Convert"、 它 的 id 设 置 成 "@+id/convert"。<br />

最 终 的 GUI 应 该 像 这 样 :<br />

步 骤 十 四<br />

点 击 "Generate" 按 钮 来 生 成 XML 布 局 。 该 xml 应 像 这 样 :<br />

<br />

<br />

<br />


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

android:text="Dollars"<br />

android:textStyle="bold"><br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

android:layout_alignRight="@+id/widget31"><br />

<br />

<br />

步 骤 十 五<br />

在 Eclipse 中 创 建 一 个 新 的 <strong>Android</strong> 工 程 。 从 DroidDraw 剪 切 该 XML 并 粘 贴 替 换 到 res/layout/main.xml 的 内<br />

容 中 。<br />

到 这 里 你 就 可 以 在 <strong>Android</strong> 中 运 行 你 的 GUI。 它 应 该 像 这 样 :<br />

步 骤 十 六<br />

最 后 一 步 是 实 际 的 代 码 货 币 转 换 。 它 不 多 , 你 可 以 用 一 下 代 码 来 查 找 到 你 的 GUI 元 素 :<br />

this.findViewById(R.id.);<br />

下 面 是 完 整 CurrentConverter Activity 的 代 码 :<br />

package zyf.CurrentConverter;<br />

import android.app.Activity;<br />

import android.os.Bundle;<br />

import android.view.View;<br />

import android.view.View.OnClickListener;<br />

import android.widget.Button;<br />

import android.widget.RadioButton;<br />

import android.widget.TextView;<br />

public class CurrentConverter extends Activity<br />

implements OnClickListener {<br />

TextView dollars;<br />

TextView euros;<br />

RadioButton dtoe;<br />

11


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

}<br />

RadioButton etod;<br />

Button convert;<br />

/** Called when the activity is first created. */<br />

@Override<br />

public void onCreate(Bundle icicle) {<br />

super.onCreate(icicle);<br />

setContentView(R.layout.main);<br />

dollars = (TextView) this.findViewById(R.id.dollars);<br />

euros = (TextView) this.findViewById(R.id.euros);<br />

dtoe = (RadioButton) this.findViewById(R.id.dtoe);<br />

dtoe.setChecked(true<br />

true);<br />

etod = (RadioButton) this.findViewById(R.id.etod);<br />

convert = (Button) this.findViewById(R.id.convert);<br />

convert.setOnClickListener(this<br />

this);<br />

}<br />

public void onClick(View v) {<br />

if (dtoe.isChecked()) {<br />

convertDollarsToEuros();<br />

}<br />

if (etod.isChecked()) {<br />

convertEurosToDollars();<br />

}<br />

}<br />

protected void convertDollarsToEuros() {<br />

double val =<br />

Double.parseDouble(dollars.getText().toString());<br />

// in a real app, we'd get this off the 'net<br />

euros.setText(Double.toString(val * 0.67));<br />

}<br />

protected void convertEurosToDollars() {<br />

double val = Double.parseDouble(euros.getText().toString());<br />

// in a real app, we'd get this off the 'net<br />

dollars.setText(Double.toString(val / 0.67));<br />

}<br />

步 骤 十 七<br />

嗯 , 就 是 这 样 。 我 希 望 你 喜 欢 该 教 程 。 意 见 和 问 题 邮 件 brendan.d.burns Gmail !<br />

12


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

结 果<br />

13


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

DroidDraw 教 程 二 : Table Layout<br />

步 骤 零<br />

本 教 程 描 述 如 何 创 建 一 个 从 DroidDraw 简 单 的 输 入 和 TableLayout 布 局 。 本 教 程 假 设 你 已 经 下 载 并 安 装 了<br />

<strong>Android</strong> SDK。 本 教 程 也 假 设 你 对 GUI 编 程 概 念 和 Java 编 程 语 言 相 当 熟 悉 。<br />

步 骤 一<br />

启 动 DroidDraw 用 户 界 面 设 计 器<br />

步 骤 二<br />

根 布 局 选 择 为 RelativeLayout 布 局<br />

步 骤 三<br />

选 择 "Layouts" 标 签<br />

14


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

步 骤 四<br />

把 一 个 TableLayout 对 象 从 Layouts 面 板 中 拖 放 到 屏 幕 顶 的 中 部 。<br />

步 骤 五<br />

双 击 "TableLayout" 来 修 改 它 的 属 性 。 把 它 的 宽 度 "width" 改 为 "fill_parent"<br />

步 骤 六<br />

把 三 个 TableRow 对 象 从 Layouts 面 板 中 拖 放 到 TableLayout 对 象 中 。 当 你 拖 放 TableRow 对 象 时 , 你 应 该 从 弹<br />

出 菜 单 中 选 择 TableLayout。<br />

步 骤 七<br />

每 一 个 TableRow 中 拖 放 一 个 TextView:<br />

15


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

步 骤 八<br />

双 击 每 一 个 TextView 来 修 改 它 的 属 性 , 修 改 显 示 文 本 如 下 图 一 样 :<br />

步 骤 九<br />

每 一 个 TableRow 中 拖 放 一 个 EditText, 放 在 存 在 的 文 本 右 边 。<br />

步 骤 十<br />

选 中 TableLayout, 修 改 "Stretchable Column"( 可 扩 展 栏 ) 属 性 值 为 1, 这 将 把 所 有 的 EditText widget 扩 展 开 来<br />

填 充 满 该 Table 表 格 。<br />

16


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

步 骤 十 一<br />

编 辑 每 一 个 EditText 的 属 性 , 让 Text 文 本 属 性 为 ""<br />

步 骤 十 二<br />

把 一 个 Button 拖 放 到 TableLayout 下 面 的 右 下 角 空 白 处 。 它 应 该 在 TableLayout 的 外 面 并 和 它 右 对 齐 。<br />

步 骤 十 三<br />

修 改 该 按 钮 的 属 性 , 文 本 设 置 为 "OK"<br />

步 骤 十 四<br />

点 击 "Generate" 按 钮 来 生 成 .xml 文 件<br />

步 骤 十 五<br />

在 Eclipse 中 , 创 建 一 个 新 的 <strong>Android</strong> 工 程<br />

17


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

步 骤 十 六<br />

用 第 十 五 步 骤 生 成 的 XML 来 替 换 res/layouts/mian.xml 文 件 内 容 。<br />

步 骤 十 七<br />

运 行 你 的 新 工 程 , 你 应 该 在 <strong>Android</strong> 中 看 到 你 的 GUI。 它 应 该 像 这 样 :<br />

完 成 !<br />

完 整 XML 文 件<br />

<br />

<br />

<br />

<br />


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

19<br />

android:layout_width="wrap_content"<br />

android:layout_height="wrap_content"<br />

android:text="Name"><br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

android:textSize="18sp"><br />

<br />

<br />

<br />

<br />

<br />

<br />

结 果<br />

20


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

DroidDraw 教 程 三 : 使 用 ListView 和 array 资 源<br />

步 骤 零<br />

在 Eclipse 新 建 一 个 工 程<br />

步 骤 一 - 创 建 初 始 化 布 局<br />

<br />

<br />

<br />

<br />

<br />

开 启 DroidDraw 并 创 建 一 个 新 的 Layout<br />

从 Widget 列 表 中 拖 放 一 个 ListView 放 入 该 Layout 中<br />

双 击 该 ListView 编 辑 它 的 属 性<br />

把 它 的 宽 、 高 属 性 值 改 为 "fill_parent"<br />

点 击 "Applay" 按 钮<br />

步 骤 二 - 创 建 一 个 Array 数 组 资 源<br />

注 意 : 这 些 使 用 说 明 是 针 对 独 立 的 DroidDraw 可 执 行 文 件 的 。<br />

<br />

<br />

<br />

<br />

<br />

点 击 DroidDraw 中 的 "Arrays" 标 签<br />

点 击 "New" 按 钮 来 添 加 一 个 新 的 Array 数 组<br />

当 提 示 名 称 时 , 使 用 "items"<br />

对 于 数 组 值 , 使 用 "," 逗 号 来 隔 开 列 表 的 值<br />

点 击 "Save" 按 钮 并 把 该 文 件 保 存 为 arrays.xml, 保 存 在 你 工 程 res/values 目 录 中<br />

21


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

步 骤 三 - 让 你 的 列 表 和 数 组 连 接<br />

<br />

<br />

<br />

<br />

在 你 第 一 步 创 建 的 ListView 上 双 击<br />

修 改 "Entry Array Id" 属 性 为 "@+id/items"<br />

点 击 "Apply" 按 钮<br />

生 成 Layout 布 局 文 件 并 保 存 它 为 main.xml, 保 存 到 你 工 程 res/layouts 目 录 中<br />

步 骤 四<br />

- 代 码<br />

使 用 以 下 代 码 在 你 的 mainActivity.java 文 件 中 :<br />

/** Called when the activity is first created. */<br />

@Override<br />

public void onCreate(Bundle icicle) {<br />

}<br />

/** Called when the activity is first created. */<br />

super.onCreate(icicle);<br />

this.setTitle("DroidDraw");<br />

setContentView(R.layout.main);<br />

22


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

步 骤 五 - 完 成<br />

在 <strong>Android</strong> 模 拟 器 中 运 行 你 的 代 码<br />

结 果<br />

23


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

<strong>Android</strong> GUI Widget 可 视 化 指 导<br />

作 为 一 个 Java <strong>Android</strong> 手 机 开 发 员 、UI 设 计 者 , 为 了 让 你 的 生 活 更 简 单 。 尝 试 用 DroidDraw 来 高 速 开 发 你<br />

的 用 户 界 面 。<br />

AnalogClock<br />

<br />

Button<br />

<br />

<br />

<br />

24


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

CheckBox<br />

<br />

<br />

<br />

<br />

25


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

DatePicker<br />

<br />

……<br />

// Required Java init code:<br />

DatePicker dp =<br />

(DatePicker)this<br />

this.findViewById(R.id.widget27);<br />

// for example init to 1/27/2008, no callback<br />

dp.init(2008, 0, 27, Calendar.SUNDAY, null);<br />

...<br />

DigitalClock<br />

<br />

26


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

EditText<br />

<br />

<br />

<br />

Gallery<br />

<br />

27


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

ImageButton<br />

<br />

ImageView<br />

<br />

ProgressBar<br />

<br />

Spinner<br />

<br />

TimePicker<br />

<br />

28


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

RadioButton<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

android:checked="false"<br />

android:layout_weight="0"<br />

android:layout_gravity="left"<br />

android:textStyle="bold_italic"><br />

<br />

<br />

TextView<br />

<br />

<br />

<br />

<br />

30


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

封 面<br />

31


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

封 面<br />

1


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

文 件 存 取 编 程 基 础<br />

文 件<br />

<br />

文 件 可 以 用 来 存 储 比 使 用 引 用 更 大 数 量 的 数 据<br />

<br />

<strong>Android</strong> 提 供 方 法 来 读 、 写 文 件<br />

<br />

只 有 本 地 文 件 可 以 被 访 问<br />

<br />

优 点 : 可 以 存 储 大 容 量 的 数 据<br />

<br />

缺 点 : 文 件 更 新 或 是 格 式 改 变 可 能 会 导 致 巨 大 的 编 程 工 作<br />

文 件 操 作<br />

读 文 件<br />

‣ Context.openFileInput(String name) 打 开 一 个 与 应 用 程 序 联 系 的 私 有 文 件 输 入 流<br />

‣ 当 文 件 不 存 在 时 抛 出 FileNotFoundException 异 常<br />

FileInputStream in = this.openFileInput("test2.txt");// 打 开 文 件 "test2.txt"<br />

……<br />

in.close();// 关 闭 输 入 流<br />

写 文 件<br />

‣ Context.openFileOutput(String name,int mode) 开 启 一 个 与 应 用 程 序 联 系 的 私 有 文 件 输 出 流<br />

‣ 当 文 件 不 存 在 时 该 文 件 将 被 创 建<br />

‣ 文 件 输 出 流 可 以 在 添 加 模 式 中 打 开 , 这 意 味 新 的 数 据 将 被 添 加 到 文 件 的 末 尾<br />

FileOutputStream out = this.openFileOutput("test2.txt",MODE_APPEND);<br />

// 打 开 文 件 "test2.txt" 进 行 写 操 作 、 使 用 MODE_APPEND 在 添 加 模 式 中 打 开 文 件<br />

……<br />

out.close();// 关 闭 输 出 流<br />

2


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

读 取 静 态 文 件<br />

‣ 要 打 开 打 包 在 应 用 程 序 中 的 静 态 文 件 , 使 用 Resources.openRawResource(R.raw.mydatafile)<br />

‣ 该 文 件 必 须 放 在 文 件 夹 res/raw/ 中<br />

InputStreamin = this.getResources().openRawResource(R.raw.my);<br />

…<br />

// 获 得 Context 资 源<br />

in.close();// 关 闭 输 入 流<br />

3


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

文 件 存 取 示 例<br />

创 建 添 加 文 件 内 容 并 保 存 , 打 开 文 件 并 显 示 内 容<br />

1<br />

新 建 工 程 FileWriteRead<br />

2 修 改 main.xml 布 局 , 添 加 一 个 EditText、 一 个 Button<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

3 在 res/layout 中 新 建 一 个 open.xml 布 局 文 件 , 添 加 一 个 TextView、 两 个 Button(" 打 开 "," 清 空 ")<br />

<br />

<br />

<br />

<br />


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

android:layout_width="80px"<br />

android:layout_height="wrap_content"<br />

android:text=" 打 开 "<br />

android:layout_x="2px"<br />

android:layout_y="378px"><br />

<br />

<br />

<br />

<br />

4<br />

文 件 存 储<br />

/* 定 义 IO 对 象 */<br />

private String Text_of_input;<br />

private OutputStream os;<br />

Text_of_input = inputArt.getText().toString();<br />

// 得 到 用 户 输 入 字 符<br />

try {<br />

os = this.openFileOutput("txtME", MODE_PRIVATE);<br />

// 打 开 一 个 文 件 输 出 流 。 名 称 为 txtME, 模 式 为 不 覆 盖<br />

os.write(Text_of_input.getBytes());<br />

// 把 内 容 写 入 文 件<br />

} catch (FileNotFoundException e) {<br />

// TODO Auto-generated catch block<br />

} catch (IOException e) {<br />

// TODO Auto-generated catch block<br />

} finally {<br />

try {<br />

}<br />

// 关 闭 文 件 输 出 流<br />

os.close();<br />

} catch (IOException e) {<br />

// TODO Auto-generated catch block<br />

}<br />

5 文 件 读 取<br />

/* 定 义 IO 对 象 */<br />

private String Text_of_output;<br />

private InputStream is;<br />

5


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

private byte[] b;<br />

try {<br />

// 打 开 一 个 文 件 输 入 流 。 名 称 为 txtME<br />

is = this.openFileInput("txtME");<br />

// 字 节 数 组 声 明 定 义<br />

b = new byte[1024];<br />

// 读 取 文 件 内 容 放 入 字 节 数 组<br />

int length = is.read(b);<br />

// 把 字 节 数 组 转 换 成 字 符 串<br />

Text_of_output = new String(b);<br />

// 显 示 读 取 内 容 长 度<br />

setTitle(" 文 件 字 数 :" + length);<br />

// 显 示 读 取 的 文 件 内 容<br />

showmyText.setText(Text_of_output);<br />

} catch (FileNotFoundException e) {<br />

// TODO Auto-generated catch block<br />

} catch (IOException e) {<br />

// TODO Auto-generated catch block<br />

}finally<br />

{<br />

try {<br />

}<br />

// 关 闭 文 件 输 入 流<br />

is.close();<br />

} catch (IOException e) {<br />

// TODO Auto-generated catch block<br />

}<br />

6 修 改 mianActivity.java 文 件 , 添 加 menu 菜 单 与 操 作<br />

package zyf.FileWrite;<br />

/* 导 入 要 使 用 的 包 */<br />

import java.io.FileNotFoundException;<br />

import java.io.IOException;<br />

import java.io.InputStream;<br />

import java.io.OutputStream;<br />

import android.app.Activity;<br />

import android.os.Bundle;<br />

import android.view.Menu;<br />

import android.view.MenuItem;<br />

import android.view.View;<br />

import android.widget.Button;<br />

import android.widget.EditText;<br />

import android.widget.TextView;<br />

import android.widget.Toast;<br />

6


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

public class FileWrite extends Activity implements Button.OnClickListener {<br />

/** Called when the activity is first created. */<br />

/* 要 使 用 的 对 象 、 变 量 声 明 */<br />

/* 保 存 部 分 */<br />

private EditText inputArt;/* 编 辑 框 , 输 入 用 户 字 符 串 */<br />

private Button saveButton;/* 按 钮 , 保 存 */<br />

private String Text_of_input;/* 字 符 串 , 用 户 输 入 的 字 符 串 */<br />

private OutputStream os;/* 文 件 输 出 流 , 保 存 文 件 流 */<br />

/* 读 取 部 分 */<br />

private TextView showmyText;/*TextView, 显 示 读 取 文 件 内 容 */<br />

private Button openTxt,cleanTxt;/* 按 钮 , 打 开 文 件 */<br />

private String Text_of_output;/* 字 符 串 , 从 文 件 中 读 取 到 得 字 符 串 */<br />

private InputStream is;/* 文 件 输 入 流 , 读 取 文 件 流 */<br />

private byte[] b;/* 字 节 数 组 , 用 来 读 取 文 件 内 容 */<br />

@Override<br />

public void onCreate(Bundle savedInstanceState) {<br />

super.onCreate(savedInstanceState);<br />

setLayoutShow(R.layout.main);/* 设 置 主 屏 布 局 */<br />

UIinit("main");/* 初 始 化 UI 元 素 方 法 */<br />

Logic("main");/* 添 加 事 件 逻 辑 方 法 */<br />

}<br />

/* 设 置 主 屏 */<br />

private void setLayoutShow(int<br />

layoutID) {<br />

// TODO Auto-generated method stub<br />

setContentView(layoutID);/* 设 置 当 前 主 屏 布 局 */<br />

}<br />

private void UIinit(String mainROopen) {<br />

/* 初 始 化 UI*/<br />

if (mainROopen.equals("main")) {<br />

inputArt = (EditText) findViewById(R.id.EditText_Txt);<br />

saveButton = (Button) findViewById(R.id.Button_Save);<br />

} else if (mainROopen.equals("open")) {<br />

showmyText = (TextView) findViewById(R.id.TextView_showTxt);<br />

openTxt = (Button) findViewById(R.id.Button_openTxt);<br />

cleanTxt=(Button)findViewById(R.id.Button_clean);<br />

}<br />

}<br />

private void Logic(String string) {<br />

// TODO Auto-generated method stub<br />

/* 为 按 钮 添 加 事 件 处 理 */<br />

if (string.equals("main")) {<br />

saveButton.setOnClickListener(this<br />

this);<br />

7


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

}<br />

} else if (string.equals("open")) {<br />

openTxt.setOnClickListener(this<br />

this);<br />

cleanTxt.setOnClickListener(this<br />

this);<br />

}<br />

@Override<br />

public void onClick(View v) {<br />

/* 根 据 ID 判 断 按 钮 事 件 */<br />

switch (v.getId()) {<br />

case R.id.Button_Save: {<br />

/* 提 示 */<br />

NoteDebug(" 文 件 保 存 ");<br />

// TODO Auto-generated method stub<br />

/* 获 得 用 户 输 入 的 字 符 串 */<br />

Text_of_input = inputArt.getText().toString();<br />

try {<br />

/* 打 开 文 件 输 出 流 , 名 称 txtME, 以 不 覆 盖 模 式 打 开 */<br />

os = this.openFileOutput("txtME", MODE_PRIVATE);<br />

/* 把 字 符 串 转 换 成 字 节 数 组 , 写 入 文 件 中 */<br />

os.write(Text_of_input.getBytes());<br />

} catch (FileNotFoundException e) {<br />

/* 文 件 未 找 到 , 异 常 */<br />

// TODO Auto-generated catch block<br />

NoteDebug(" 文 件 关 闭 失 败 " + e);<br />

} catch (IOException e) {<br />

/* 文 件 写 入 错 误 */<br />

// TODO Auto-generated catch block<br />

NoteDebug(" 文 件 写 入 失 败 " + e);<br />

} finally {<br />

try {<br />

}<br />

/* 关 闭 文 件 输 出 流 */<br />

os.close();<br />

} catch (IOException e) {<br />

// TODO Auto-generated catch block<br />

}<br />

NoteDebug(" 文 件 关 闭 失 败 " + e);<br />

/* 输 入 框 清 空 */<br />

inputArt.setText("");<br />

}<br />

break;<br />

case R.id.Button_openTxt: {<br />

NoteDebug(" 文 件 打 开 ");<br />

8


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

try {<br />

/* 打 开 文 件 输 入 流 , 名 称 txtME*/<br />

is = this.openFileInput("txtME");<br />

/* 初 始 化 字 节 数 组 */<br />

b = new byte[1024];<br />

/* 从 文 件 输 入 流 中 读 取 内 容 到 字 节 数 组 中 , 返 回 内 容 长 度 */<br />

int length = is.read(b);<br />

/* 把 字 节 数 组 转 换 成 字 符 串 */<br />

Text_of_output = new String(b);<br />

/* 设 置 标 题 , 显 示 文 件 内 容 长 度 */<br />

setTitle(" 文 件 字 数 :" + length);<br />

/* 显 示 文 件 内 容 */<br />

showmyText.setText(Text_of_output);<br />

} catch (FileNotFoundException e) {<br />

/* 文 件 未 找 到 , 异 常 */<br />

// TODO Auto-generated catch block<br />

NoteDebug(" 文 件 打 开 失 败 " + e);<br />

} catch (IOException e) {<br />

}<br />

/* 文 件 读 取 错 误 , 异 常 */<br />

// TODO Auto-generated catch block<br />

NoteDebug(" 文 件 读 取 失 败 " + e);<br />

}<br />

finally {<br />

try {<br />

}<br />

/* 关 闭 文 件 输 入 流 */<br />

is.close();<br />

} catch (IOException e) {<br />

// TODO Auto-generated catch block<br />

}<br />

NoteDebug( " 文 件 关 闭 失 败 "+e);<br />

}<br />

break;<br />

case R.id.Button_clean:{<br />

/* 清 空 */<br />

showmyText.setText("");<br />

NoteDebug(" 清 空 ");<br />

}<br />

break;<br />

default:<br />

break;<br />

}<br />

9


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

@Override<br />

public boolean onCreateOptionsMenu(Menu menu) {<br />

// TODO Auto-generated method stub<br />

}<br />

/* 添 加 三 个 菜 单 项 目 , 并 设 置 图 片 */<br />

menu.add(0, 1, 1, "Edit").setIcon(R.drawable.ic_menu_edit);<br />

menu.add(0, 2, 2, "Open").setIcon(R.drawable.ic_menu_agenda);<br />

menu.add(0, 3, 3, "Exit").setIcon(R.drawable.ic_lock_power_off);<br />

return super.onCreateOptionsMenu(menu);<br />

}<br />

@Override<br />

public boolean onOptionsItemSelected(MenuItem item) {<br />

// TODO Auto-generated method stub<br />

switch (item.getItemId()) {<br />

case 1:<br />

/* 显 示 main.xml 为 主 屏 布 局 */<br />

setLayoutShow(R.layout.main);<br />

UIinit("main");<br />

Logic("main");<br />

NoteDebug(" 编 辑 文 件 Layout");<br />

break;<br />

case 2:<br />

/* 显 示 open.xml 为 主 屏 布 局 */<br />

setLayoutShow(R.layout.open);<br />

UIinit("open");<br />

Logic("open");<br />

NoteDebug( " 打 开 文 件 Layout");<br />

break;<br />

case 3:<br />

/* 退 出 */<br />

finish();<br />

NoteDebug( "Byebye");<br />

break;<br />

default:<br />

break;<br />

}<br />

return super.onOptionsItemSelected(item);<br />

}<br />

private void NoteDebug(String showString){<br />

}<br />

/* 显 示 Toast 提 示 */<br />

Toast.makeText(this<br />

this,showString, Toast.LENGTH_SHORT).show();<br />

10


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

7<br />

结 果<br />

11


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

数 据 库 编 程 基 础<br />

SQLite 数 据 库<br />

• 在 某 些 情 况 下 , 文 件 不 是 有 效 的<br />

‣ 如 果 多 线 程 数 据 访 问 是 相 关 的<br />

‣ 如 果 应 用 程 序 处 理 可 能 变 化 的 复 杂 数 据 结 构<br />

‣ 等 等<br />

• 因 此 ,<strong>Android</strong> 带 来 了 内 置 SQLite 数 据 库 支 持<br />

• 数 据 库 对 于 创 建 它 们 的 包 套 件 是 私 有 的<br />

• 数 据 库 不 应 该 用 来 存 贮 文 件<br />

• 提 示 : 在 SDK 中 的 samples/NotePad 下 可 以 找 到 关 于 如 何 使 用 数 据 库 的 例 子<br />

• SQLite 是 一 个 轻 量 级 的 软 件 库<br />

• 实 现 了 一 个 完 全 适 应 严 峻 环 境 的 数 据 库<br />

‣ 原 子 量 性<br />

‣ 坚 固 性<br />

‣ 独 立 性<br />

‣ 耐 久 性<br />

• 体 积 大 小 只 用 几 千 字 节<br />

• 一 些 SQL 的 指 令 只 是 部 分 支 持 , 例 如 :ALTER、TABLE<br />

• 参 阅 http://www.sqlite.org 获 取 更 多 信 息<br />

创 建 数 据 库<br />

‣ Context.createDatabase(String name,int version ,int mode,CursorFactory factory) 创 建 一 个 新 的 数 据 库 并<br />

返 回 一 个 SQLiteDatabase 对 象<br />

‣ 假 如 数 据 库 不 能 被 创 建 , 则 抛 出 FileNotFoundException 异 常<br />

‣ 新 创 建 SQLite 数 据 库 方 法<br />

SQLiteDatabase mydataBase=SQLiteDatabase.create(new<br />

CursorFactory(){<br />

// 创 建 一 个 数 据 库<br />

// 工 厂 类 , 一 个 可 选 工 厂 类 , 当 查 询 时 调 用 来 实 例 化 一 个 光 标<br />

@Override<br />

public Cursor newCursor(SQLiteDatabase db,<br />

}<br />

SQLiteCursorDriver masterQuery, String editTable,<br />

SQLiteQuery query) {<br />

// TODO Auto-generated method stub<br />

return null;<br />

});<br />

12


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

SQLiteDatabase myDataBase=this<br />

this.openOrCreateDatabase("myDataBase.db",<br />

MODE_PRIVATE, new CursorFactory(){<br />

// 创 建 新 的 数 据 库 , 名 称 myDatabase, 模 式 MODE_PRIVATE, 鼠 标 工 厂<br />

// 工 厂 类 , 一 个 可 选 工 厂 类 , 当 查 询 时 调 用 来 实 例 化 一 个 光 标<br />

@Override<br />

public Cursor newCursor(SQLiteDatabase db,<br />

}<br />

SQLiteCursorDriver masterQuery, String editTable,<br />

SQLiteQuery query) {<br />

// TODO Auto-generated method stub<br />

return null;<br />

});<br />

删 除 数 据 库<br />

‣ Context.deleteDatabase(String name) 删 除 指 定 名 称 的 数 据 库<br />

‣ 假 如 数 据 库 成 功 删 除 则 返 回 true, 失 败 则 为 false( 例 如 数 据 库 不 存 在 )<br />

// 删 除 指 定 名 称 的 数 据 库<br />

this.deleteDatabase("myDatabase.db");<br />

打 开 数 据 库<br />

‣ Context.openDatabase(String file,CursorFactory factory) 打 开 一 个 存 在 的 数 据 库 并 返 回 一 个<br />

SQLiteDatabase 对 象<br />

‣ 如 果 数 据 库 不 存 在 则 抛 出 FileNotFoundException 异 常<br />

// 创 建 一 个 名 为 :myDataBase 的 数 据 库 , 后 缀 为 .db<br />

SQLiteDatabase my_DataBase=this<br />

this.openOrCreateDatabase("myDateBase.db",<br />

MODE_PRIVATE, null);<br />

my_DataBase.close();// 不 要 忘 记 关 闭 数 据 库<br />

非 查 询 SQL 指 令<br />

‣ SQLiteDatabase.execSQL(String sql) 可 以 用 来 执 行 非 查 询 SQL 指 令 , 这 些 指 令 没 有 结 果<br />

‣ 包 括 :CREATE TABLE / DROP TABLE / INSERT 等 等<br />

‣ 例 如 :<br />

1<br />

创 建 一 个 名 为 "test" 并 带 两 个 参 数 的 表<br />

// 创 建 一 个 名 为 "test" 并 带 两 个 参 数 的 表<br />

my_DataBase.execSQL("CREATE TABLE test (_id INTEGER PRIMARY KEY,<br />

someNumber INTERGER);");<br />

13


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

2<br />

在 数 据 库 中 插 入 一 个 元 组<br />

// 在 数 据 库 中 插 入 一 个 元 组<br />

my_DataBase.execSQL("INSERT INTO test (_id,someNumber) values(1,8);");<br />

3<br />

删 除 表<br />

// 删 除 表<br />

my_DataBase.execSQL("DROP TABLE test");<br />

查 询 SQL 指 令 - 游 标 Cursors<br />

‣ <strong>Android</strong> 使 用 游 标 (Cursors) 来 导 航 浏 览 查 询 结 果<br />

‣ 游 标 (Cursors) 被 android.database.Cursor 对 象 来 描 述<br />

‣ 一 个 游 标 (Cursors) 是 一 个 简 单 的 指 针 , 它 从 查 询 结 果 的 一 个 元 组 跳 到 下 一 个 元 组 ( 或 是 前 一 个 或 是 第<br />

一 个 或 是 ……)<br />

‣ 游 标 (Cursors) 在 它 定 位 位 置 的 那 一 刻 返 回 元 组 数 据<br />

表 test<br />

_id someNumber<br />

1 8<br />

2 10<br />

3 2<br />

// 为 了 创 建 一 个 Cursor( 游 标 ), 必 须 执 行 一 个 查 询 , 要 么 通 过 SQL 使 用 rawQuery() 方 法<br />

// 或 是 更 精 心 设 计 的 方 法 , 像 query() 方 法<br />

Cursor cur=my_DataBase.rawQuery("SELECT * FORM test", null);<br />

if(cur!=null<br />

null){// 游 标 不 为 空<br />

// 返 回 给 定 名 称 的 列 的 基 于 0 开 始 的 index, 如 果 该 属 性 列 不 存 在 则 返 回 -1<br />

// 通 过 它 们 的 index 来 检 索 属 性 值<br />

int numColumn=cur.getColumnIndex("someNumber");<br />

if(cur.moveToFirst()){<br />

//cur.moveToFirst() 让 游 标 指 向 第 一 行 , 如 果 游 标 指 向 第 一 行 , 则 返 回 true<br />

do {<br />

int num=cur.getInt(numColumn);// 获 得 当 前 行 该 属 性 的 值<br />

/*Cursor 提 供 了 不 同 的 方 法 来 回 索 不 同 的 数 据 类 型<br />

例 如 getInt(int index)/getString(int index) 等 等 */<br />

/* 做 一 些 事 情 */<br />

} while (cur.moveToNext());<br />

/* 游 标 移 动 到 下 一 行 , 如 果 游 标 已 经 通 过 了 结 果 集 中 的 最 后 ,<br />

即 没 有 行 可 以 移 动 时 , 则 返 回 false*/<br />

// 其 他 可 能 移 动 的 是 previous() 和 first() 方 法<br />

}<br />

}<br />

14


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

封 面<br />

15


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

封 面<br />

1


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

应 用<br />

为 程 序 添 加 Menu 菜 单<br />

// 创 建 OptionsMenu publ i c bool ean onCreateOpti onsMenu(Menu<br />

menu)<br />

public boolean onCreateOptionsMenu(Menu menu) {<br />

// TODO Auto-generated method stub<br />

boolean result = super.onCreateOptionsMenu(menu);<br />

menu.add(0, INSERT_ID_Play, 0, R.string.menu_toPlay);<br />

menu.add(0, INSERT_ID_Stop, 0, R.string.menu_toStop);<br />

return result;<br />

}// 创 建 菜 单<br />

// 处 理 选 择 事 件 publi c bool ean onOpti onsIt emSel ect ed(MenuIt em i t em)<br />

}<br />

public boolean onOptionsItemSelected(MenuItem item) {<br />

// TODO Auto-generated method stub<br />

if(item.getItemId()==INSERT_ID_Play){<br />

Play_Music();<br />

}<br />

if(item.getItemId()==INSERT_ID_Stop){<br />

Stop_Music();<br />

}<br />

return super.onOptionsItemSelected(item);<br />

2


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

应 用 SDCard<br />

1 打 开 CMD<br />

2 进 入 C:\Documents and Settings\ 地 狱 怒 兽 \Local Settings\Application Data\<strong>Android</strong>\SDK-1.1 目 录<br />

3 创 建 sdcard 镜 像 mksdcard 256M ./sdcard.img<br />

4 往 SDCard 中 添 加 资 源 :adb push zyf.mp3 /sdcard/zyf.mp3<br />

5 往 SDCard 中 获 取 资 源 :adb pull /sdcard/mybaby.jpg C:\<br />

6 重 启 模 拟 器 后 , 文 件 即 在 虚 拟 SDCard 中<br />

向 模 拟 器 安 装 APK 软 件 包<br />

1<br />

2<br />

3<br />

4<br />

打 开 cmd<br />

切 换 到 <strong>Android</strong> SDK tools 目 录 下<br />

把 APK 软 件 包 复 制 到 <strong>Android</strong> SDK tools 目 录 下<br />

adb install Snake.pak<br />

删 除 模 拟 器 中 APK 软 件 包<br />

1 打 开 模 拟 器<br />

2 打 开 cmd<br />

3 adb shell<br />

4 cd data/app<br />

5 ls -l<br />

6 rm 文 件 名 .apk<br />

3


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

对 话 框 的 简 单 应 用<br />

AlertDialog.Builder<br />

public class DialogDemo extends Activity implements OnClickListener{<br />

public void onCreate(Bundle savedInstanceState) {<br />

super.onCreate(savedInstanceState);<br />

setContentView(R.layout.main);<br />

AlertDialog.Builder myBuilder=new<br />

AlertDialog.Builder(this<br />

this);<br />

myBuilder.setIcon(R.drawable.hermes);<br />

myBuilder.setTitle(" 我 的 对 话 框 ");<br />

myBuilder.setPositiveButton(" 退 出 ", this);<br />

myBuilder.show();<br />

}<br />

public void onClick(DialogInterface dialog, int which) {<br />

}<br />

}<br />

Dialog<br />

public class DialogDemo extends Activity {<br />

public void onCreate(Bundle savedInstanceState) {<br />

super.onCreate(savedInstanceState);<br />

setContentView(R.layout.main);<br />

Dialog myDialog=new<br />

Dialog(this<br />

this);<br />

myDialog.setTitle("this is a Dialog");<br />

myDialog.show();<br />

}<br />

}<br />

排 版 布 局 Layout<br />

元 件 名 稱<br />

FrameLayout<br />

AbsoluteLayout<br />

LinearLayout<br />

RelativeLayout<br />

TableLayout<br />

説 明<br />

單 一 物 件 的 容 器<br />

以 絕 對 座 標 排 版 的 容 器<br />

線 性 ( 水 平 或 垂 直 ) 排 版 的 容 器<br />

以 相 對 座 標 ( 相 對 於 父 元 件 或 兄 弟 元 件 ) 排 版 的 容 器<br />

以 表 格 方 式 排 版 的 容 器<br />

4


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

TextView 中 的 超 链 接 文 本<br />

<br />

<br />

关 键 点 : 设 置 了 该 属 性 则 可<br />

以 自 动 链 接 , 否 则 没 有 链 接<br />

5


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

时 间 设 置 对 话 框 DatePickerDialog 的 使 用<br />

public void onCreate(Bundle icicle) {<br />

super.onCreate(icicle);<br />

setContentView(R.layout.main);<br />

Button btn = (Button) findViewById(R.id.date);<br />

btn.setOnClickListener(this<br />

this);<br />

}<br />

@Override<br />

public void onClick(View v) {// 普 通 按 钮 事 件<br />

Calendar d = Calendar.getInstance(Locale.CHINA);<br />

// 创 建 一 个 日 历 引 用 d, 通 过 静 态 方 法 getInstance() 从 指 定 时 区 Locale.CHINA 获 得 一 个 日 期 实 例<br />

Date myDate=new<br />

Date();<br />

// 创 建 一 个 Date 实 例<br />

d.setTime(myDate);<br />

// 设 置 日 历 的 时 间 , 把 一 个 新 建 Date 实 例 myDate 传 入<br />

int year=d.get(Calendar.YEAR);<br />

int month=d.get(Calendar.MONTH);<br />

int day=d.get(Calendar.DAY_OF_MONTH);<br />

// 获 得 日 历 中 的 year month day<br />

DatePickerDialog dlg=new<br />

DatePickerDialog(this<br />

this,this<br />

this,year,month,day);<br />

// 新 建 一 个 DatePickerDialog 构 造 方 法 中<br />

( 设 备 上 下 文 ,OnDateSetListener 时 间 设 置 监 听 器 , 默 认 年 , 默 认 月 , 默 认 日 )<br />

dlg.show();<br />

// 让 DatePickerDialog 显 示 出 来<br />

}<br />

@Override<br />

public void onDateSet(DatePicker view, int year, int monthOfYear,int<br />

dayOfMonth){<br />

//DatePickerDialog 中 按 钮 Set 按 下 时 自 动 调 用<br />

TextView txt = (TextView) findViewById(R.id.text);<br />

// 通 过 id 获 得 TextView 对 象<br />

txt.setText(Integer.toString(year) + "-" +<br />

Integer.toString(monthOfYear) + "-" +<br />

Integer.toString(dayOfMonth));<br />

// 设 置 text<br />

}<br />

6


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

ListView 的 使 用 1<br />

1 ListView 的 声 明 、 定 义<br />

ListView list=new<br />

ListView(this<br />

this);<br />

2 数 组 适 配 器 的 生 命 定 义<br />

String []name=new<br />

new String[]{"Java","C++","C","C#","VB","XML",".NET","J#"};<br />

ArrayAdapter arrayadapter<br />

=new<br />

ArrayAdapter(this<br />

this,<br />

android.R.layout.simple_list_item_1,name);<br />

3 给 ListView 设 置 数 组 适 配 器<br />

list.setAdapter(arrayadapter);<br />

4 设 置 ListView 的 元 素 被 选 中 时 的 事 件 处 理 监 听 器<br />

list.setOnItemClickListener(this<br />

this);<br />

5 事 件 处 理 监 听 器 方 法<br />

@Override<br />

public void onItemClick(AdapterView arg0,<br />

View arg1, int arg2, long arg3) {<br />

// TODO Auto-generated method stub<br />

setTitle(GetData(arg2));<br />

}<br />

6 让 ListView 中 的 内 容 变 化 , 重 新 设 置 一 个 ArrayAdapter 即 可<br />

String []score=new<br />

String[]{"93","76","84","85","93","84","88","78"};<br />

ArrayAdapter arratadapter2=new<br />

ArrayAdapter(this<br />

this,<br />

android.R.layout.simple_expandable_list_item_1,score);<br />

list.setAdapter(arratadapter2);<br />

7


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

ListView 的 使 用 2<br />

1 ListView 在 XML 文 件 中 声 明<br />

<br />

2 ListView 在 java 文 件 中 获 得<br />

listview = (ListView) findViewById(R.id.list);<br />

// 从 list.xml 中 获 得 ListView 对 象 list<br />

3 声 明 和 定 义 、 初 始 化 一 个 ArrayList<br />

private ArrayList arrayList;<br />

arrayList= new ArrayList();<br />

Map map;<br />

map= new HashMap();<br />

map.put("System", "Linux");<br />

map.put("Ability", "Cool");<br />

arrayList.add(item);<br />

4 声 明 和 定 义 、 初 始 化 一 个 SimpleAdepter<br />

SimpleAdapter adapter;<br />

adapter= new SimpleAdapter(this<br />

this, coll,<br />

android.R.layout.simple_list_item_1,<br />

new String[] { "System" }, new int[] { android.R.id.text1 });<br />

5<br />

LixtView 设 置 适 配 器<br />

listview.setAdapter(adapter);// 设 置 适 配 器<br />

6 为 ListView 设 置 选 项 事 件 监 听 器<br />

listview.setOnItemClickListener(listener);<br />

OnItemClickListener listener = new OnItemClickListener() {<br />

public void onItemClick(AdapterView arg0, View arg1, int arg2,<br />

long arg3) {<br />

textview.setTextColor(Color.YELLOW);<br />

textview.setText(coll.get(arg2).get("prod_type").toString());<br />

}<br />

};// 事 件 处 理 接 口 实 现<br />

8


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

ListActivity 的 使 用<br />

1 定 义 一 个 类 继 承 自 ListActivity<br />

public class ListActivityOfMe extends ListActivity {}<br />

2 声 明 和 定 义 、 初 始 化 一 个 ArrayList<br />

private ArrayList arrayList;<br />

arrayList= new ArrayList();<br />

Map map;<br />

map= new HashMap();<br />

map.put("System", "Linux");<br />

map.put("Ability", "Cool");<br />

arrayList.add(item);<br />

3 声 明 和 定 义 、 初 始 化 一 个 SimpleAdepter<br />

SimpleAdapter adapter;<br />

adapter= new SimpleAdapter(this<br />

this, arrayList,<br />

android.R.layout.simple_list_item_1,<br />

new String[] { "System" }, new int[] { android.R.id.text1 });<br />

4 LixtView 设 置 适 配 器<br />

this.setAdapter(adapter);// 设 置 适 配 器<br />

5 选 项 按 键 事 件 处 理 , 不 需 要 .setOnItemClickListener(); 直 接 实 现 以 下 方 法<br />

protected void onListItemClick(ListView l, View v, int position,<br />

{<br />

// TODO Auto-generated method stub<br />

super.onListItemClick(l, v, position, id);<br />

actionTo(position);<br />

}<br />

long id)<br />

9


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

数 据 共 享 SharedPreferences<br />

1 数 据 请 求 端 , 线 先 开 启 另 一 个 Activity<br />

Intent startNextLayout=new<br />

Intent();<br />

startNextLayout.setClass(myEx.this<br />

this,choiceGroupActivity.class<br />

class);<br />

startActivity(startNextLayout);<br />

// 开 启 另 一 个 Activity<br />

2 数 据 选 择 端 , 设 置 好 数 据 , 利 用 实 现 了 SharePreferences 接 口 的 Editor 子 类 添 加 并 修 改 数 据<br />

Editor passfileEditor=getSharedPreferences("ITEM", 0).edit();<br />

3<br />

passfileEditor.putString("ChoiceKye", myContentString);<br />

// 设 置 数 据 Key, 并 添 加 数 据 myContentString 到 共 享 区<br />

数 据 选 择 端 , 存 入 数 据 , 关 闭 Activity。<br />

passfileEditor.commit();// 委 托 , 存 入 数 据<br />

finish();//<br />

获 得 实 现 了 SharePreferences<br />

接 口 的 Editor 对 象<br />

4<br />

数 据 请 求 端 , 利 用 SharePreferences 接 口 来 获 取 数 据 Key, 然 后 通 过 getString(String Key,String<br />

Defaultvalue) 来 获 得 Key 中 数 据<br />

SharedPreferences sharedPreferences=getSharedPreferences("ITEM", 0);<br />

// 得 到 共 享 区 "ITEM" 的 接 口 引 用<br />

String show=sharedPreferences.getString("ChoiceKye", "there is NONE")<br />

/* 利 用 Key"ChoiceKye" 从 SharePreferences 接 口 引 用 中<br />

得 到 ChoiceKye 的 内 容 , 没 有 时 为 默 认 值 "there is NONE"*/<br />

TextView showTextView=(TextView)findViewById(R.id.showR);<br />

showTextView.setText(show);// 显 示 ChoiceKye 的 内 容<br />

10


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

Intents 和 ListActivity:<br />

创 建 联 系 人 列 表 并 和 联 系 人 打 电 话 应 用 程 序<br />

内 容 : 这 个 教 程 教 我 们 怎 么 开 发 一 个 ListActivity 应 用 , 联 系 人 的 列 表 装 载 到 了 基 于 List 的 View. 然 后 可 以 选<br />

择 其 中 之 一 打 电 话 .<br />

目 的 : 可 以 非 常 容 易 的 学 会 Intents 和 ListActivities 的 使 用 .<br />

Main.xml<br />

<br />

<br />

<br />

<br />

<br />

11


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

<strong>Android</strong>Manifest.xml<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

12


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

Java<br />

package zyf.CallME;<br />

import android.app.ListActivity;<br />

import android.content.*;<br />

import android.database.Cursor;<br />

import android.os.Bundle;<br />

import android.provider.Contacts.People;<br />

import android.view.View;<br />

import android.widget.*;<br />

public class CallME extends ListActivity {<br />

private String[] name;<br />

private int[] to;<br />

private SimpleCursorAdapter sadapter;<br />

private Intent callIntent;<br />

private long PhoneID;<br />

@Override<br />

public void onCreate(Bundle icicle) {<br />

super.onCreate(icicle);<br />

try {<br />

Cursor c =<br />

getContentResolver().query(People.CONTENT_URI, null,<br />

null, null, null);<br />

startManagingCursor(c);<br />

name = new String[] { People.NAME };<br />

to = new int[] { R.id.row_entry };<br />

sadapter = new SimpleCursorAdapter(this<br />

this,R.layout.main, c, name, to);<br />

this.setListAdapter(sadapter);<br />

} catch (Exception e) {<br />

Toast.makeText(this<br />

this, " 联 系 人 读 取 错 误 ",<br />

Toast.LENGTH_LONG).show();<br />

}<br />

}<br />

@Override<br />

protected void onListItemClick(ListView l,<br />

View v, int position, long id) {<br />

super.onListItemClick(l, v, position, id);<br />

callIntent=new<br />

new Intent(Intent.ACTION_CALL);<br />

Cursor c=(Cursor)sadapter.getItem(position);<br />

PhoneID=c.getLong(c.getColumnIndex(People.PRIMARY_PHONE_ID));<br />

callIntent.setData(ContentUris.withAppendedId(android.provider.<br />

Contacts.Phones.CONTENT_URI, PhoneID));<br />

startActivity(callIntent);<br />

}<br />

}<br />

13


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

解 析<br />

1<br />

在 main.xml 中 添 加 两 个 TextView<br />

用 于 显 示 "Name:" 的 静 态 标 签<br />

<br />

用 于 动 态 添 加 并 显 示 联 系 人 的 姓 名 内 容 的 TextView<br />

<br />

2<br />

修 改 LinearLayout 的 布 局 方 向<br />

android:orientation="horizontal"<br />

// 说 明 横 向 排 布<br />

3 <strong>Android</strong>Manifest.xml 中 说 明 使 用 权 限<br />

<br />

// 说 明 可 以 访 问 读 取 联 系 人 信 息<br />

<br />

// 说 明 可 以 使 用 打 电 话 功 能<br />

4<br />

Java 代 码 中 的 读 取 联 系 人 信 息 处 理<br />

try {<br />

Cursor c =<br />

getContentResolver().query(People.CONTENT_URI, null,null<br />

null, null);<br />

//Cursor, 该 接 口 提 供 从 数 据 库 提 取 信 息 返 回 结 果 中 随 机 读 写 访 问<br />

//ContentResolver 提 供 应 用 程 序 访 问 Content 模 型<br />

//ContentResolver.query() 抽 取 给 定 的 URI, 返 回 一 个 在 结 果 之 上 的 Cursor<br />

startManagingCursor(c);<br />

// 该 方 法 允 许 Activity 基 于 Activity 的 生 命 周 期 来 为 你 处 理 管 理 给 定 的 Cursor 的 生 命 周 期<br />

name = new String[] { People.NAME };<br />

// 新 建 用 户 名 数 组 People 类 用 于 列 出 联 系 人 People.NAME 得 到 联 系 人 姓 名<br />

14


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

to = new int[] { R.id.row_entry };<br />

// 创 建 一 个 TextView 引 用 数 组 用 来 放 置 获 取 的 People.NAME<br />

sadapter = new SimpleCursorAdapter(this<br />

this,R.layout.main, c, name, to);<br />

this.setListAdapter(sadapter);<br />

// 创 建 一 个 简 单 的 适 配 器 从 一 个 cursor 指 针 到 TextView 或 是 ImageView 的 map 专 栏 适 配 器 。<br />

// 构 造 方 法 (Context,layout,Cursor,from,to), 第 一 参 数 是 设 备 上 下 文 , 第 二 个 参 数 是 布 局 文<br />

件 , 第 三 个 参 数 是 指 向 联 系 人 URI 的 Cursor 指 针 ,form 代 表 来 源 的 字 符 串 ( 联 系 人 名 ),to 把 联 系 人 名 放 到<br />

的 地 方 (TextView)<br />

} catch (Exception e) {<br />

Toast.makeText(this<br />

this, " 联 系 人 读 取 错 误 ",Toast.LENGTH_LONG).show();<br />

//Toast 显 示 提 示 , 不 打 扰 用 户 。.show() 用 来 显 示 Toast<br />

}<br />

5 Java 代 码 中 的 点 击 事 件 处 理 ( 选 择 后 电 话 联 系 该 联 系 人 )<br />

protected void onListItemClick(ListView l,View v, int position, long id) {<br />

// TODO Auto-generated method stub<br />

super.onListItemClick(l, v, position, id);<br />

callIntent=new<br />

new Intent(Intent.ACTION_CALL);<br />

}<br />

// 创 建 一 个 带 有 Call 动 作 的 Intent<br />

Cursor c=(Cursor)sadapter.getItem(position);<br />

// 通 过 选 中 的 Items 位 置 来 获 取 相 应 的 联 系 人 指 针 Cursor<br />

PhoneID=c.getLong(c.getColumnIndex(People.PRIMARY_PHONE_ID));<br />

// 获 取 相 应 联 系 人 电 话 号 码<br />

//getLong() 返 回 请 求 数 据 的 一 个 长 整 型<br />

// 为 给 定 的 列 , 返 回 基 于 0 的 索 引 值<br />

//People.PRIMARY_PHONE_ID 获 取 主 键 电 话 号 码<br />

callIntent.setData(ContentUris.withAppendedId(android.provider.<br />

// 为 Intent 设 置 操 作 的 数 据<br />

Contacts.Phones.CONTENT_URI, PhoneID));<br />

//ContentUris 操 作 带 有 数 据 内 容 的 Uri 的 实 用 方 法 、 它 们 带 有 "Content" 体 制<br />

//withAppendedId() 把 给 定 的 ID 添 加 到 path 后 面 第 一 个 参 数 是 开 始 的 , 后 面 参 数 是 添 加 的<br />

startActivity(callIntent);<br />

// 开 启 Intent<br />

15


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

<strong>Android</strong> Permission 大 全<br />

<strong>Android</strong> SDK 1.0 访 问 权 限 许 可<br />

程 序 执 行 需 要 读 取 到 安 全 敏 感 项 必 需 在 androidmanifest.xml 中 声 明 相 关 权 限 请 求 , 完 整 列 表 如 下 :<br />

android.permission.ACCESS_CHECKIN_PROPERTIES<br />

允 许 读 写 访 问 "properties" 表 在 checkin 数 据 库 中 , 改 值 可 以 修 改 上 传 ( Allows read/write access to the "properties"<br />

table in the checkin database, to change values that get uploaded)<br />

android.permission.ACCESS_COARSE_LOCATION<br />

允 许 一 个 程 序 访 问 CellID 或 WiFi 热 点 来 获 取 粗 略 的 位 置 (Allows an application to access coarse (e.g., Cell-ID,<br />

WiFi) location)<br />

android.permission.ACCESS_FINE_LOCATION<br />

允 许 一 个 程 序 访 问 精 良 位 置 ( 如 GPS) (Allows an application to access fine (e.g., GPS) location)<br />

android.permission.ACCESS_LOCATION_EXTRA_COMMANDS<br />

允 许 应 用 程 序 访 问 额 外 的 位 置 提 供 命 令 (Allows an application to access extra location provider commands)<br />

android.permission.ACCESS_MOCK_LOCATION<br />

允 许 程 序 创 建 模 拟 位 置 提 供 用 于 测 试 (Allows an application to create mock location providers for testing)<br />

android.permission.ACCESS_NETWORK_STATE<br />

允 许 程 序 访 问 有 关 GSM 网 络 信 息 (Allows applications to access information about networks)<br />

android.permission.ACCESS_SURFACE_FLINGER<br />

允 许 程 序 使 用 SurfaceFlinger 底 层 特 性 (Allows an application to use SurfaceFlinger's low level features)<br />

16


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

android.permission.ACCESS_WIFI_STATE<br />

允 许 程 序 访 问 Wi-Fi 网 络 状 态 信 息 (Allows applications to access information about Wi-Fi networks)<br />

android.permission.ADD_SYSTEM_SERVICE<br />

允 许 程 序 发 布 系 统 级 服 务 (Allows an application to publish system-level services).<br />

android.permission.BATTERY_STATS<br />

允 许 程 序 更 新 手 机 电 池 统 计 信 息 (Allows an application to update the collected battery statistics)<br />

android.permission.BLUETOOTH<br />

允 许 程 序 连 接 到 已 配 对 的 蓝 牙 设 备 (Allows applications to connect to paired bluetooth devices)<br />

android.permission.BLUETOOTH_ADMIN<br />

允 许 程 序 发 现 和 配 对 蓝 牙 设 备 (Allows applications to discover and pair bluetooth devices)<br />

android.permission.BRICK<br />

请 求 能 够 禁 用 设 备 ( 非 常 危 险 )(Required to be able to disable the device (very *erous!).)<br />

android.permission.BROADCAST_PACKAGE_REMOVED<br />

允 许 程 序 广 播 一 个 提 示 消 息 在 一 个 应 用 程 序 包 已 经 移 除 后 (Allows an application to broadcast a notification that<br />

an application package has been removed)<br />

android.permission.BROADCAST_STICKY<br />

允 许 一 个 程 序 广 播 常 用 intents(Allows an application to broadcast sticky intents)<br />

17


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

android.permission.CALL_PHONE<br />

允 许 一 个 程 序 初 始 化 一 个 电 话 拨 号 不 需 通 过 拨 号 用 户 界 面 需 要 用 户 确 认 (Allows an application to initiate a<br />

phone call without going through the Dialer user interface for the user to confirm the call being placed.)<br />

android.permission.CALL_PRIVILEGED<br />

允 许 一 个 程 序 拨 打 任 何 号 码 , 包 含 紧 急 号 码 无 需 通 过 拨 号 用 户 界 面 需 要 用 户 确 认 (Allows an application to call<br />

any phone number, including emergency numbers, without going through the Dialer user interface for the user to<br />

confirm the call being placed)<br />

android.permission.CAMERA<br />

请 求 访 问 使 用 照 相 设 备 (Required to be able to access the camera device. )<br />

android.permission.CHANGE_COMPONENT_ENABLED_STATE<br />

允 许 一 个 程 序 是 否 改 变 一 个 组 件 或 其 他 的 启 用 或 禁 用 (Allows an application to change whether an application<br />

component (other than its own) is enabled or not. )<br />

android.permission.CHANGE_CONFIGURATION<br />

允 许 一 个 程 序 修 改 当 前 设 置 , 如 本 地 化 (Allows an application to modify the current configuration, such as locale. )<br />

android.permission.CHANGE_NETWORK_STATE<br />

允 许 程 序 改 变 网 络 连 接 状 态 (Allows applications to change network connectivity state)<br />

android.permission.CHANGE_WIFI_STATE<br />

允 许 程 序 改 变 Wi-Fi 连 接 状 态 (Allows applications to change Wi-Fi connectivity state)<br />

android.permission.CLEAR_APP_CACHE<br />

允 许 一 个 程 序 清 楚 缓 存 从 所 有 安 装 的 程 序 在 设 备 中 (Allows an application to clear the caches of all installed<br />

applications on the device. )<br />

18


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

android.permission.CLEAR_APP_USER_DATA<br />

允 许 一 个 程 序 清 除 用 户 设 置 (Allows an application to clear user data)<br />

android.permission.CONTROL_LOCATION_UPDATES<br />

允 许 启 用 禁 止 位 置 更 新 提 示 从 无 线 模 块 (Allows enabling/disabling location update notifications from the radio. )<br />

android.permission.DELETE_CACHE_FILES<br />

允 许 程 序 删 除 缓 存 文 件 (Allows an application to delete cache files)<br />

android.permission.DELETE_PACKAGES<br />

允 许 一 个 程 序 删 除 包 (Allows an application to delete packages)<br />

android.permission.DEVICE_POWER<br />

允 许 访 问 底 层 电 源 管 理 (Allows low-level access to power management)<br />

android.permission.DIAGNOSTIC<br />

允 许 程 序 RW 诊 断 资 源 (Allows applications to RW to diagnostic resources. )<br />

android.permission.DISABLE_KEYGUARD<br />

允 许 程 序 禁 用 键 盘 锁 (Allows applications to disable the keyguard )<br />

android.permission.DUMP<br />

允 许 程 序 返 回 状 态 抓 取 信 息 从 系 统 服 务 (Allows an application to retrieve state dump information from system<br />

services.)<br />

19


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

android.permission.EXPAND_STATUS_BAR<br />

允 许 一 个 程 序 扩 展 收 缩 在 状 态 栏 ,android 开 发 网 提 示 应 该 是 一 个 类 似 Windows Mobile 中 的 托 盘 程 序 (Allows an<br />

application to expand or collapse the status bar. )<br />

android.permission.FACTORY_TEST<br />

作 为 一 个 工 厂 测 试 程 序 , 运 行 在 root 用 户 (Run as a manufacturer test application, running as the root user. )<br />

android.permission.FLASHLIGHT<br />

访 问 闪 光 灯 ,android 开 发 网 提 示 HTC Dream 不 包 含 闪 光 灯 (Allows access to the flashlight )<br />

android.permission.FORCE_BACK<br />

允 许 程 序 强 行 一 个 后 退 操 作 是 否 在 顶 层 activities(Allows an application to force a BACK operation on whatever is<br />

the top activity. )<br />

android.permission.FOTA_UPDATE<br />

暂 时 不 了 解 这 是 做 什 么 使 用 的 ,android 开 发 网 分 析 可 能 是 一 个 预 留 权 限 .<br />

android.permission.GET_ACCOUNTS<br />

访 问 一 个 帐 户 列 表 在 Accounts Service 中 (Allows access to the list of accounts in the Accounts Service)<br />

android.permission.GET_PACKAGE_SIZE<br />

允 许 一 个 程 序 获 取 任 何 package 占 用 空 间 容 量 (Allows an application to find out the space used by any package. )<br />

android.permission.GET_TASKS<br />

允 许 一 个 程 序 获 取 信 息 有 关 当 前 或 最 近 运 行 的 任 务 , 一 个 缩 略 的 任 务 状 态 , 是 否 活 动 等 等 (Allows an<br />

application to get information about the currently or recently running tasks: a thumbnail representation of the tasks,<br />

what activities are running in it, etc.)<br />

20


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

android.permission.HARDWARE_TEST<br />

允 许 访 问 硬 件 (Allows access to hardware peripherals. )<br />

android.permission.INJECT_EVENTS<br />

允 许 一 个 程 序 截 获 用 户 事 件 如 按 键 、 触 摸 、 轨 迹 球 等 等 到 一 个 时 间 流 ,android 开 发 网 提 醒 算 是 hook 技 术 吧<br />

(Allows an application to inject user events (keys, touch, trackball) into the event stream and deliver them to ANY<br />

window.)<br />

android.permission.INSTALL_PACKAGES<br />

允 许 一 个 程 序 安 装 packages(Allows an application to install packages. )<br />

android.permission.INTERNAL_SYSTEM_WINDOW<br />

允 许 打 开 窗 口 使 用 系 统 用 户 界 面 (Allows an application to open windows that are for use by parts of the system<br />

user interface. )<br />

android.permission.INTERNET<br />

允 许 程 序 打 开 网 络 套 接 字 (Allows applications to open network sockets)<br />

android.permission.MANAGE_APP_TOKENS<br />

允 许 程 序 管 理 ( 创 建 、 催 后 、z- order 默 认 向 z 轴 推 移 ) 程 序 引 用 在 窗 口 管 理 器 中 (Allows an application to manage<br />

(create, destroy, Z-order) application tokens in the window manager. )<br />

android.permission.MASTER_CLEAR<br />

目 前 还 没 有 明 确 的 解 释 ,android 开 发 网 分 析 可 能 是 清 除 一 切 数 据 , 类 似 硬 格 机<br />

android.permission.MODIFY_AUDIO_SETTINGS<br />

允 许 程 序 修 改 全 局 音 频 设 置 (Allows an application to modify global audio settings)<br />

21


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

android.permission.MODIFY_PHONE_STATE<br />

允 许 修 改 话 机 状 态 , 如 电 源 , 人 机 接 口 等 (Allows modification of the telephony state - power on, mmi, etc. )<br />

android.permission.MOUNT_UNMOUNT_FILESYSTEMS<br />

允 许 挂 载 和 反 挂 载 文 件 系 统 可 移 动 存 储 (Allows mounting and unmounting file systems for removable storage. )<br />

android.permission.PERSISTENT_ACTIVITY<br />

允 许 一 个 程 序 设 置 他 的 activities 显 示 (Allow an application to make its activities persistent. )<br />

android.permission.PROCESS_OUTGOING_CALLS<br />

允 许 程 序 监 视 、 修 改 有 关 播 出 电 话 (Allows an application to monitor, modify, or abort outgoing calls)<br />

android.permission.READ_CALENDAR<br />

允 许 程 序 读 取 用 户 日 历 数 据 (Allows an application to read the user's calendar data.)<br />

android.permission.READ_CONTACTS<br />

允 许 程 序 读 取 用 户 联 系 人 数 据 (Allows an application to read the user's contacts data.)<br />

android.permission.READ_FRAME_BUFFER<br />

允 许 程 序 屏 幕 波 或 和 更 多 常 规 的 访 问 帧 缓 冲 数 据 (Allows an application to take screen shots and more generally<br />

get access to the frame buffer data)<br />

android.permission.READ_INPUT_STATE<br />

允 许 程 序 返 回 当 前 按 键 状 态 (Allows an application to retrieve the current state of keys and switches. )<br />

android.permission.READ_LOGS<br />

允 许 程 序 读 取 底 层 系 统 日 志 文 件 (Allows an application to read the low-level system log files. )<br />

22


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

android.permission.READ_OWNER_DATA<br />

允 许 程 序 读 取 所 有 者 数 据 (Allows an application to read the owner's data)<br />

android.permission.READ_SMS<br />

允 许 程 序 读 取 短 信 息 (Allows an application to read SMS messages.)<br />

android.permission.READ_SYNC_SETTINGS<br />

允 许 程 序 读 取 同 步 设 置 (Allows applications to read the sync settings)<br />

android.permission.READ_SYNC_STATS<br />

允 许 程 序 读 取 同 步 状 态 (Allows applications to read the sync stats)<br />

android.permission.REBOOT<br />

请 求 能 够 重 新 启 动 设 备 (Required to be able to reboot the device. )<br />

android.permission.RECEIVE_BOOT_COMPLETED<br />

允 许 一 个 程 序 接 收 到 ACTION_BOOT_COMPLETED 广 播 在 系 统 完 成 启 动 (Allows an application to receive the<br />

ACTION_BOOT_COMPLETED that is broadcast after the system finishes booting. )<br />

android.permission.RECEIVE_MMS<br />

允 许 一 个 程 序 监 控 将 收 到 MMS 彩 信 , 记 录 或 处 理 (Allows an application to monitor incoming MMS messages, to<br />

record or perform processing on them. )<br />

android.permission.RECEIVE_SMS<br />

允 许 程 序 监 控 一 个 将 收 到 短 信 息 , 记 录 或 处 理 (Allows an application to monitor incoming SMS messages, to<br />

record or perform processing on them.)<br />

23


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

android.permission.RECEIVE_WAP_PUSH<br />

允 许 程 序 监 控 将 收 到 WAP PUSH 信 息 (Allows an application to monitor incoming WAP push messages. )<br />

android.permission.RECORD_AUDIO<br />

允 许 程 序 录 制 音 频 (Allows an application to record audio)<br />

android.permission.REORDER_TASKS<br />

允 许 程 序 改 变 Z 轴 排 列 任 务 (Allows an application to change the Z-order of tasks)<br />

android.permission.RESTART_PACKAGES<br />

允 许 程 序 重 新 启 动 其 他 程 序 (Allows an application to restart other applications)<br />

android.permission.SEND_SMS<br />

允 许 程 序 发 送 SMS 短 信 (Allows an application to send SMS messages)<br />

android.permission.SET_ACTIVITY_WATCHER<br />

允 许 程 序 监 控 或 控 制 activities 已 经 启 动 全 局 系 统 中 Allows an application to watch and control how activities are<br />

started globally in the system.<br />

android.permission.SET_ALWAYS_FINISH<br />

允 许 程 序 控 制 是 否 活 动 间 接 完 成 在 处 于 后 台 时 Allows an application to control whether activities are immediately<br />

finished when put in the background.<br />

android.permission.SET_ANIMATION_SCALE<br />

修 改 全 局 信 息 比 例 (Modify the global animation scaling factor.)<br />

24


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

android.permission.SET_DEBUG_APP<br />

配 置 一 个 程 序 用 于 调 试 (Configure an application for debugging.)<br />

android.permission.SET_ORIENTATION<br />

允 许 底 层 访 问 设 置 屏 幕 方 向 和 实 际 旋 转 (Allows low-level access to setting the orientation (actually rotation) of the<br />

screen.)<br />

android.permission.SET_PREFERRED_APPLICATIONS<br />

允 许 一 个 程 序 修 改 列 表 参 数<br />

PackageManager.addPackageToPreferred() 和 PackageManager.removePackageFromPreferred() 方 法 (Allows an<br />

application to modify the list of preferred applications with the PackageManager.addPackageToPreferred()<br />

and PackageManager.removePackageFromPreferred() methods.)<br />

android.permission.SET_PROCESS_FOREGROUND<br />

允 许 程 序 当 前 运 行 程 序 强 行 到 前 台 (Allows an application to force any currently running process to be in the<br />

foreground.)<br />

android.permission.SET_PROCESS_LIMIT<br />

允 许 设 置 最 大 的 运 行 进 程 数 量 (Allows an application to set the maximum number of (not needed) application<br />

processes that can be running. )<br />

android.permission.SET_TIME_ZONE<br />

允 许 程 序 设 置 时 间 区 域 (Allows applications to set the system time zone)<br />

android.permission.SET_WALLPAPER<br />

允 许 程 序 设 置 壁 纸 (Allows applications to set the wallpaper )<br />

25


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

android.permission.SET_WALLPAPER_HINTS<br />

允 许 程 序 设 置 壁 纸 hits(Allows applications to set the wallpaper hints)<br />

android.permission.SIGNAL_PERSISTENT_PROCESSES<br />

允 许 程 序 请 求 发 送 信 号 到 所 有 显 示 的 进 程 中 (Allow an application to request that a signal be sent to all persistent<br />

processes)<br />

android.permission.STATUS_BAR<br />

允 许 程 序 打 开 、 关 闭 或 禁 用 状 态 栏 及 图 标 Allows an application to open, close, or disable the status bar and its<br />

icons.<br />

android.permission.SUBSCRIBED_FEEDS_READ<br />

允 许 一 个 程 序 访 问 订 阅 RSS Feed 内 容 提 供 (Allows an application to allow access the subscribed feeds<br />

ContentProvider. )<br />

android.permission.SUBSCRIBED_FEEDS_WRITE<br />

系 统 暂 时 保 留 改 设 置 ,android 开 发 网 认 为 未 来 版 本 会 加 入 该 功 能 。<br />

android.permission.SYSTEM_ALERT_WINDOW<br />

允 许 一 个 程 序 打 开 窗 口 使 用 TYPE_SYSTEM_ALERT, 显 示 在 其 他 所 有 程 序 的 顶 层 (Allows an application to<br />

open windows using the type TYPE_SYSTEM_ALERT, shown on top of all other applications. )<br />

android.permission.VIBRATE<br />

允 许 访 问 振 动 设 备 (Allows access to the vibrator)<br />

android.permission.WAKE_LOCK<br />

允 许 使 用 PowerManager 的 WakeLocks 保 持 进 程 在 休 眠 时 从 屏 幕 消 失 ( Allows using PowerManager WakeLocks<br />

to keep processor from sleeping or screen from dimming)<br />

26


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

android.permission.WRITE_APN_SETTINGS<br />

允 许 程 序 写 入 API 设 置 (Allows applications to write the apn settings)<br />

android.permission.WRITE_CALENDAR<br />

允 许 一 个 程 序 写 入 但 不 读 取 用 户 日 历 数 据 (Allows an application to write (but not read) the user's calendar data. )<br />

android.permission.WRITE_CONTACTS<br />

允 许 程 序 写 入 但 不 读 取 用 户 联 系 人 数 据 (Allows an application to write (but not read) the user's contacts data. )<br />

android.permission.WRITE_GSERVICES<br />

允 许 程 序 修 改 Google 服 务 地 图 (Allows an application to modify the Google service map. )<br />

android.permission.WRITE_OWNER_DATA<br />

允 许 一 个 程 序 写 入 但 不 读 取 所 有 者 数 据 (Allows an application to write (but not read) the owner's data.)<br />

android.permission.WRITE_SETTINGS<br />

允 许 程 序 读 取 或 写 入 系 统 设 置 (Allows an application to read or write the system settings. )<br />

android.permission.WRITE_SMS<br />

允 许 程 序 写 短 信 (Allows an application to write SMS messages)<br />

android.permission.WRITE_SYNC_SETTINGS<br />

允 许 程 序 写 入 同 步 设 置 (Allows applications to write the sync settings)<br />

27


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

<strong>Android</strong> SDK1.5 新 视 角<br />

用 户 界 面 的 改 进<br />

<strong>Android</strong> SDK1.5 的 UI 做 了 很 多 细 节 的 改 进 ,Google 微 调 了 所 有 核 心 UI 组 件 的 样 式 , 使 其 更 加 美 观 , 并 且 对<br />

包 括 Browser,Gmail,Email,Calendar,Camera&Gallery 以 及 Contacts 等 在 内 的 自 带 程 序 界 面 都 作 了 优 化 。<br />

让 我 们 来 看 一 个 例 子 , 这 是 新 建 联 系 人 的 界 面 , 左 侧 是 来 自 <strong>Android</strong> 1.1 的 截 图 , 右 侧 是 来 自 1.5 的 截 图 ( 此<br />

图 来 自 Google <strong>Android</strong> 官 方 Blog)。 我 们 可 以 看 到 下 拉 选 择 框 和 按 钮 的 样 式 发 生 了 不 小 的 变 化 , 而 且 添 加 联<br />

系 人 详 情 的 方 式 也 更 加 简 便 了 ,1.1 中 的 More Info 按 钮 不 见 了 , 取 而 代 之 的 是 每 一 个 项 目 后 面 的 添 加 和 删 除<br />

按 钮 。 有 兴 趣 的 朋 友 可 以 打 开 1.1 和 1.5 的 模 拟 器 来 比 较 一 下 两 者 在 操 作 上 的 差 异 。<br />

28


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

全 新 的 视 屏 录 制 功 能<br />

上 传 视 频 到 Youtube, 上 传 照 片 到 Picasa<br />

<strong>Android</strong> 1.5 中 , 用 户 可 以 利 用 内 置 的 摄 像 头 来 拍 摄 视 频 , 并 且 立 即 上 传 到 Youtube 与 朋 友 分 享 ( 尽 管 目 前 看<br />

来 G1 的 3M 摄 像 头 效 果 不 太 理 想 , 希 望 G2 的 5M 摄 像 头 效 果 会 好 一 些 )。 同 样 , 用 户 所 拍 的 照 片 也 将 可 以<br />

方 便 的 上 传 到 Picasa 相 册 。<br />

当 用 户 完 成 拍 摄 / 拍 照 后 , 只 需 按 一 下 “Share” 按 钮 ,<strong>Android</strong> 便 会 让 你 选 择 Share 的 方 式 , 只 要 选 择<br />

Youtube/Picasa, 然 后 输 入 你 的 账 户 信 息 , 就 可 以 开 始 上 传 了 。<br />

软 键 盘 的 支 持<br />

G1 带 有 一 个 QWERTY 物 理 键 盘 , 而 G2 将 取 消 全 键 盘 而 改 用 全 触 摸 的 设 计 , 所 以 软 键 盘 也 是 <strong>Android</strong> 1.5 中<br />

一 个 非 常 重 要 的 特 性 。 下 面 我 们 来 看 一 张 <strong>Android</strong> 1.5 软 键 盘 的 截 图 吧 , 键 盘 的 布 局 还 是 标 准 的 QWERTY,<br />

有 一 个 Shift 键 以 及 输 入 模 式 切 换 键 , 进 入 数 字 模 式 以 后 , 可 以 输 入 数 字 以 及 +-*/?! 等 常 用 符 号 , 按 ALT 就 可<br />

以 输 入 一 些 不 太 常 用 的 符 号 。<br />

29


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

中 文 显 示 和 中 文 输 入 的 支 持<br />

<strong>Android</strong> 1.1 除 了 英 语 以 外 , 只 能 支 持 德 语 , 而 <strong>Android</strong> 1.5 的 国 际 化 有 了 更 进 一 步 的 发 展 , 支 持 了 包 括 简 体 /<br />

繁 体 中 文 、 日 语 、 朝 鲜 语 、 西 班 牙 语 、 法 语 、 意 大 利 语 、 荷 兰 语 、 波 兰 语 、 俄 语 在 内 的 各 国 语 言 ( 大 概 主 要<br />

语 种 就 差 葡 萄 牙 语 了 吧 ,Correct me if I’m wrong :))。 当 然 我 最 关 心 的 就 是 对 于 中 文 显 示 和 输 入 的 支 持 了 。<br />

启 动 模 拟 器 , 载 入 1.5 的 Image 后 , 默 认 语 言 依 旧 是 英 语 , 当 我 在 Settings–>Locale & text 中 把 Locale 改 成<br />

Chinese(China) 之 后 , 界 面 语 言 就 切 换 到 中 文 了 。<br />

不 过 这 时 候 ,Google 拼 音 输 入 法 却 并 不 工 作 , 我 们 调 出 软 键 盘 以 后 还 是 看 不 到 切 换 到 中 文 的 按 键 , 尽 管 在<br />

Locale & text 设 置 中 , 它 是 被 选 中 的 。 我 们 需 要 反 选 “<strong>Android</strong> 键 盘 ” 这 一 选 项 , 然 后 退 出 设 置 菜 单 , 这 时 Google<br />

拼 音 输 入 法 就 可 以 工 作 了 。<br />

关 于 输 入 的 另 一 个 值 得 注 意 的 特 性 是 , 得 益 于 IMF 我 们 可 以 安 装 第 3 方 的 输 入 法 来 取 代 Google 拼 音 , 也 许<br />

不 久 以 后 就 会 有 <strong>Android</strong> 版 的 搜 狗 拼 音 、 五 笔 加 加 。<br />

30


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

桌 面 Widgets 和 Live folders<br />

首 先 , 相 对 于 <strong>Android</strong>1.1 来 说 , 自 带 的 桌 面 Widge 增 加 了 Calendar 和 Music player,Music player widget 的 样<br />

式 看 起 来 还 不 错 。<br />

至 于 Live folder, 自 带 的 包 括 列 出 所 有 联 系 人 , 列 出 所 有 有 电 话 号 码 的 联 系 人 , 以 及 列 出 Starred 联 系 人 , 因<br />

为 缺 少 可 定 制 性 , 这 个 功 能 现 在 看 来 似 乎 并 不 怎 么 吸 引 人 。 不 过 新 增 的 Home screen widgets API 和 Live folders<br />

API 使 得 开 发 者 可 以 编 写 各 种 新 奇 的 Widget 和 Live Folder 来 丰 富 <strong>Android</strong> 的 应 用 。<br />

蓝 牙 功 能 改 进<br />

<strong>Android</strong> 1.5 的 蓝 牙 增 加 了 A2DP(Advanced Audio Distribution Profile) 和 AVRCP(Audio Video Remote Cortrol<br />

Profile) 的 支 持 , 立 体 声 显 著 提 升 了 通 过 蓝 牙 听 音 乐 的 用 户 体 验 ,AVRCP 则 允 许 用 户 通 过 蓝 牙 进 行 包 括 暂 停 、<br />

停 止 、 启 动 重 放 、 音 量 控 制 及 其 它 类 型 的 远 程 控 制 操 作 。 另 外 ,Auto-pairing 则 使 耳 机 与 手 机 连 接 更 加 快 捷 方<br />

便 。<br />

31


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

捆 绑 应 用 功 能 改 进<br />

<strong>Android</strong> 1.5 内 置 的 Chrome lite 浏 览 器 采 用 了 最 新 的 Webkit 引 擎 和 Squirrelfish Javascript 引 擎 , 并 且 开 始 支 持<br />

网 页 内 容 复 制 和 页 内 搜 索 功 能 , 窗 口 下 方 的 Zoom In/Out 菜 单 也 有 变 化 , 同 时 用 户 可 以 指 定 网 页 默 认 编 码 。<br />

我 比 较 感 兴 趣 的 就 是 网 页 内 容 复 制 和 页 内 搜 索 了 , 看 一 下 截 图 吧 。<br />

Gtalk、Contacts、SMS、MMS、Gmail 和 Email 程 序 直 接 的 集 成 也 更 加 紧 密 , 使 得 用 户 可 以 在 Contacts、SMS、<br />

MMS、Gmail 和 Email 中 查 看 Gtalk 联 系 人 的 状 态 等<br />

Gmail 客 户 端 软 件 中 , 批 量 的 存 档 、 删 除 、 加 Label 操 作 也 已 经 得 到 支 持 。<br />

另 外 ,<strong>Android</strong> 1.5 还 对 SD 卡 的 管 理 做 了 改 进 , 增 加 了 文 件 系 统 检 查 和 自 动 修 复 功 能 。<br />

系 统 性 能 优 化<br />

除 了 上 面 提 到 的 新 功 能 ,<strong>Android</strong> 1.5 还 有 不 少 性 能 上 的 改 进<br />

包 括 :<br />

* 更 快 的 摄 像 头 启 动 和 拍 摄 速 度<br />

* 更 快 地 获 取 GPS 位 置<br />

* 浏 览 器 中 更 平 滑 的 滚 屏<br />

* Gmail 中 更 快 的 对 话 列 表 滚 屏 等<br />

32


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

<strong>Android</strong> 图 书 大 全<br />

<strong>Android</strong> 中 文 教 程 图 书<br />

Google <strong>Android</strong> 开 发 入 门 与 实 战<br />

33


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

Google <strong>Android</strong> SDK 开 发 范 例 大 全 / 佘 志 龙<br />

34


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

Google <strong>Android</strong> 程 式 设 计 与 应 用 / 杨 文 志<br />

Google!<strong>Android</strong> 手 机 应 用 程 式 设 计 入 门 / 盖 索 林<br />

35


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

<strong>Android</strong> 应 用 框 架 原 理 与 程 式 设 计 36 技 / 高 焕 堂<br />

36


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

Google <strong>Android</strong> 设 计 招 式 之 美 / 高 焕 堂<br />

37


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

<strong>Android</strong> 应 用 软 体 架 构 设 计 / 高 焕 堂<br />

38


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

<strong>Android</strong> 与 物 件 导 向 技 术 / 高 焕 堂<br />

39


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

<strong>Android</strong> 外 文 书 籍<br />

40


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

<strong>Android</strong> 网 站 资 源 收 集 大 全<br />

eoe<strong>Android</strong> 国 内 一 流 的 <strong>Android</strong> 开 发 社 区<br />

http://www.eoeandroid.com/?fromuid=3245<br />

eoeMobile 国 内 一 流 的 <strong>Android</strong> 开 发 团 队<br />

http://www.eoemobile.com/index<br />

<strong>Android</strong> 爱 好 者 论 坛<br />

http://www.loveandroid.com/<br />

<strong>Android</strong> 开 发 者 论 坛<br />

http://www.androidin.com/<br />

google 主 站 :<br />

http://code.google.com/android/<br />

E 文 文 档<br />

http://code.google.com/android/documentation.html<br />

<strong>Android</strong> 中 国 开 发 者 团 队 google groups<br />

http://groups.google.com/group/android-developers-zh<br />

中 文 社 区<br />

http://www.androidcn.net<br />

http://www.androidcn.net/wiki<br />

41


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

google groups<br />

http://groups.google.com/group/android-developers<br />

Other Open Handset Alliance Project<br />

http://code.google.com/p/android/downloads/list<br />

OHA: 开 放 手 持 设 备 联 盟 官 方 网 站<br />

http://www.openhandsetalliance.com/<br />

GPhone 论 坛<br />

http://bbs.gphone999.com/<br />

Linux 基 金 会<br />

http://www.linux-foundation.org/<br />

Mobile Linux<br />

http://www.linux-foundation.org/en/Mobile_Linux<br />

OMA: 开 放 移 动 联 盟<br />

http://www.linux-foundation.org/<br />

LiPS Forum<br />

http://www.lipsforum.org/<br />

CE Linux Forum<br />

http://tree.celinuxforum.org/<br />

42


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

Gnome Mobile and Embedded (GMAE)<br />

http://www.gnome.org/mobile/<br />

LiMo Foundation<br />

https://www.limofoundation.org/sf/sfmain/do/home<br />

Ubuntu Mobile<br />

https://lists.ubuntu.com/archive ... 007-May/000289.html<br />

Mobile & Internet Linux Project<br />

http://www.moblin.org/<br />

国 外 网 站<br />

http://www.androidboards.com/<br />

http://www.androidev.com/<br />

http://androidcommunity.com/<br />

http://anddev.org/<br />

<strong>Android</strong> Wiki - Main Page<br />

http://androidwiki.com/wiki/Main_Page<br />

Official Google<strong>Android</strong><br />

Developers Blog<br />

http://android-developers.blogspot.com/<br />

Open Handset Magazine<br />

http://openhandsetmagazine.com/<br />

Google<strong>Android</strong><br />

Platform - The<strong>Android</strong><br />

Log<br />

http://theandroidlog.com/<br />

43


-----------------------------------<strong>Android</strong> 编 程 基 础<br />

封 面<br />

44

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!