27.02.2014 Views

Android 开发教程

Android 开发教程

Android 开发教程

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

-----------------------------------<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!