大 话 企 业 级 Android 开 发 第 九 部 分 本 教 程 说 明 及 版 权 声 明 大 话 企 业 级 Android 开 发 是 国 士 工 作 室 为 了 方 便 中 国 Android 开 发 者, 推 动 Android 企 业 级 应 用 开 发, 特 投 入 大 量 心 血 撰 写 的 书 籍, 并 在 网 络 上 免 费 发 布, 希 望 为 移 动 互 联 网 和 智 能 手 机 时 代 贡 献 绵 薄 之 力! 所 有 相 关 文 档 版 权 均 属 国 士 工 作 室 所 有 本 教 程 是 由 国 士 工 作 室 参 考 官 方 文 档, 综 合 市 面 相 关 书 籍, 经 过 充 分 的 吸 收 消 化, 结 合 开 发 实 践 的 一 部 原 创 作 品, 为 了 本 教 程 及 早 与 广 大 读 者 同 仁 见 面 分 享, 特 采 用 定 稿 一 部 分 就 发 布 一 部 分 的 连 载 方 式 发 布 读 者 可 以 在 本 博 客 获 取 最 新 内 容 未 经 国 士 工 作 室 授 权, 禁 止 将 此 文 档 及 其 衍 生 作 品 以 标 准 ( 纸 质 ) 书 籍 形 式 发 行 本 文 档 受 有 关 法 律 的 版 权 保 护, 对 本 文 档 内 容 的 任 何 未 经 同 意 的 复 制 和 抄 袭 行 为, 将 导 致 相 应 的 法 律 责 任 未 经 国 士 工 作 室 同 意, 任 何 团 体 及 个 人 不 能 用 此 教 程 牟 利, 违 者 必 究 但 是 : 在 不 收 取 其 他 人 费 用 的 前 提 下, 您 可 以 自 由 传 播 此 文 档, 但 必 须 保 证 版 权 信 息 文 档 及 其 自 带 标 示 的 完 整 性 如 果 对 该 文 档 有 任 何 疑 问 或 者 建 议, 请 进 入 官 方 博 客 http://www.cnblogs.com/guoshiandroid/ 留 言 或 者 直 接 与 国 士 工 作 室 联 系 ( 后 附 联 系 方 式 ), 我 们 会 慎 重 参 考 您 的 建 议 并 根 据 需 要 对 本 文 档 进 行 修 改, 以 造 福 更 多 开 发 者! 大 话 企 业 级 Android 开 发 的 最 新 及 完 整 内 容 会 在 国 士 工 作 室 官 方 博 客 定 期 更 新, 请 访 问 国 士 工 作 室 博 客 http://www.cnblogs.com/guoshiandroid/ 获 取 更 多 更 新 内 容
关 于 国 士 工 作 室 我 们 ( 国 士 工 作 室 ) 是 一 支 专 注 于 Android 平 台 企 业 级 应 用 开 发 的 技 术 团 队, 对 娱 乐 多 媒 体 应 用 有 着 深 刻 的 理 解 及 研 发 能 力, 致 力 服 务 于 企 业 用 户 为 音 视 频 等 娱 乐 多 媒 体 网 站 门 户 网 站 SNS 论 坛 电 子 商 务 等 传 统 网 络 应 用 向 移 动 互 联 网 发 展 提 供 解 决 方 案 和 技 术 支 持, 为 企 业 提 供 Android 培 训 服 务 等 多 种 业 务 我 们 尤 其 擅 长 于 提 供 从 Android 客 户 端 到 服 务 端 的 一 站 式 解 决 方 案 和 技 术 支 持, 服 务 端 可 以 采 用 Java EE, 也 可 以 采 用 轻 量 级 流 行 的 LAMP 技 术 体 系 目 前, 研 发 出 了 比 KU6 优 酷 更 加 强 大 和 完 善 的 Android 视 频 网 站 娱 乐 多 媒 体 客 户 端 软 件, 并 在 持 续 升 级 中 目 前, 我 们 正 在 务 实 而 卓 有 成 效 的 与 音 视 频 等 娱 乐 多 媒 体 网 站 门 户 网 站 SNS 论 坛 电 子 商 务 等 传 统 网 络 服 务 商 合 作, 发 展 迅 速, 渴 望 有 志 之 士 的 加 入, 和 我 们 一 起 为 成 为 世 界 最 好 的 Android 软 件 开 发 和 咨 询 培 训 公 司 而 奋 斗, 为 移 动 互 联 网 和 智 能 手 机 时 代 贡 献 力 量! 联 系 我 们 电 话 :15711060468 Email:guoshiandroid@gmail.com 博 客 : http://www.cnblogs.com/guoshiandroid/
1.3 硬 编 码 生 成 界 面 在 Android 中 不 仅 可 以 使 用 Xml 格 式 的 布 局 文 件 进 行 界 面 设 计,Layout 的 存 在 本 来 就 是 要 解 决 显 示 层 的 问 题, 可 是 大 部 分 人 总 是 习 惯 性 的 使 用 编 码 的 方 式 进 行 实 现 对 布 局 操 作 这 样 做 的 不 仅 使 Activity 变 的 臃 肿, 也 使 代 码 变 的 杂 乱 无 章 但 有 时 会 有 些 特 殊 需 要, 我 们 需 要 在 代 码 中 直 接 生 成 界 面 但 鉴 于 经 典 的 MVC 模 式, 界 面 属 于 视 图 层, 我 们 建 议 在 可 能 的 情 况 下 将 视 图 层 分 离 出 来 不 过 有 时 也 会 用 到 在 代 码 中 编 写 视 图, 下 面 通 过 一 个 小 例 子 来 介 绍 这 种 使 用 方 法 创 建 项 目 创 建 一 个 名 为 DynamicLayout 的 项 目, 界 面 如 下 :
编 写 DynamicLayoutActivity.java package com.sharpandroid.dlayout; import android.app.activity; import android.os.bundle; import android.view.viewgroup; import android.widget.linearlayout; import android.widget.textview;
public class DynamicLayoutActivityDynamic extends Activity { } /** Called when the activity is first created. */ @Override public void oncreate(bundle savedinstancestate) { } super.oncreate(savedinstancestate); LinearLayout layout = new LinearLayout(this); LinearLayout.LayoutParams layoutparams = new LinearLayout.LayoutParams (ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT); setcontentview(layout, layoutparams); TextView textview = new TextView(this); textview.settext(" 我 从 java 代 码 中 来, 而 不 是 XML 布 局 文 件!"); LinearLayout.LayoutParams textviewparams = new LinearLayout.LayoutParams (ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); layout.addview(textview, textviewparams); 说 明 : LinearLayout layout = new LinearLayout(this); 创 建 一 个 线 性 布 局 对 象 LinearLayout.LayoutParams layoutparams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT); 创 建 一 个 布 局 参 数, 确 定 该 线 性 布 局 的 宽 和 高 setcontentview(layout, layoutparams); 把 该 组 件 显 示 在 屏 幕 上 TextView textview = new TextView(this); 创 建 一 个 TextView textview.settext(" 我 从 java 代 码 中 来, 而 不 是 XML 布 局 文 件!"); 设 置 textview 上 显 示 的 文 字 信 息 layout.addview(textview, textviewparams); 将 textview 添 加 入 布 局 文 件 中 执 行 程 序 结 果 如 下 图 :
该 例 子 比 较 简 单, 但 基 本 的 使 用 思 路 是 通 用 的 如 果 在 开 发 中 需 要 用 到 动 态 生 成 界 面, 可 以 查 看 帮 助 文 档 中 的 相 关 信 息 方 式 如 下 图
1.4 国 际 化 如 今 全 球 各 国 间 的 交 流 与 合 作 越 来 越 多,3G 开 发 作 为 与 互 联 网 类 似, 一 个 好 的 应 用 往 往 能 够 能 满 足 许 多 国 家 用 户 的 需 求 但 各 国 语 言 不 同, 因 此 必 须 针 对 不 同 的 语 言 开 发 不 同 的 界 面, 但 应 用 的 处 理 逻 辑 是 不 用 改 变 的 Android 为 我 们 提 供 了 灵 活 的 方 式 处 理 这 一 点, 让 我 们 很 方 便 的 就 能 使 自 己 的 应 用 支 持 多 国 语 言 实 现 国 际 化 Android 中 国 际 化 的 操 作 非 常 方 便, 只 需 要 将 欲 国 际 化 的 资 源, 如 文 字 图 片 界 面 等 建 立 一 个 以 原 有 存 放 的 文 件 夹 values drawable layout 的 后 面 加 上 - 语 言 代 码 -r 国 家 代 码, 如 values-en-rus 目 录 下 的 文 件 会 在 系 统 的 地 区 设 置 为 美 国 时 被 自 动 使 用 如 果 没 有 相 关 的 语 言 包 系 统 将 使 用 默 认 的 values 包 中 的 资 源 可 以 自 己 查 看 文 档 上 相 关 的 资 源 查 看 的 方 式 如 下 图 相 关 国 家 代 码 可 以 点 击 如 下 图 中 的 框 中 的 链 接 查 看
下 图 为 做 国 际 化 与 自 动 适 应 屏 幕 分 辨 率 处 理 后 的 项 目 的 目 录 结 构
下 面 将 我 们 的 第 一 个 项 目 HelloWorld 做 成 支 持 中 英 文 两 种 语 言 的 国 际 化 项 目 步 骤 如 下 创 建 国 际 化 文 字 信 息 文 件 打 开 HelloWorld 项 目, 进 入 res/ 目 录 下 拷 贝 values 文 件 夹, 将 其 粘 贴 进 同 目 录 下, 出 现 如 下 对 话 框, 输 入 如 下 内 容,
其 中 en 代 表 英 语,r 是 国 家 地 区 的 前 缀,US 表 示 美 国 values-en-rus 合 起 来 就 是 当 手 机 系 统 上 的 地 区 设 置 为 美 国 时, 程 序 中 引 用 到 strings.xml 中 文 字 的 地 方 会 使 用 该 文 件 夹 下 的 strings.xml 的 文 本 点 击 OK, 进 入 values-en-rus 文 件 夹 下 打 开 其 strings.xml 文 件 进 行 修 改 修 改 所 有 文 字 为 英 文, 修 改 后 如 下 : <?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">hello,android!</string> <string name="app_name">first Project!</string> </resources> 再 将 values 文 件 夹 拷 贝 一 次, 粘 贴 到 res 文 件 夹 中, 此 次 输 入 的 内 容 如 下 values-zh-rcn 代 表 中 国 汉 语 修 改 该 文 件 夹 下 的 strings.xml 文 件, 内 容 如 下 <?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello"> 安 致, 你 好!</string> <string name="app_name"> 第 一 个 应 用 </string> </resources>
此 时, 中 国 中 文 和 美 国 英 文 两 个 国 际 化 文 件 夹 都 已 经 创 建 完 成 创 建 国 际 化 图 片 文 件 由 于 图 片 上 可 能 有 文 字 显 示, 或 者 国 家 之 间 风 俗 习 惯 不 同, 对 图 片 的 认 知 可 能 也 有 差 异, 因 此 图 片 也 需 要 国 际 化 我 们 拷 贝 res 下 drawable hdpi 文 件 夹, 粘 贴 到 res 下, 出 现 如 下 对 话 框, 创 建 英 文 图 片 包 输 入 如 下 内 容 drawable-en-rus-hdpi 含 义 与 values-en-rus 一 致 创 建 中 文 图 片 包, 输 入 如 下 为 了 将 两 个 包 中 的 图 片 加 以 区 别, 我 们 在 手 机 语 言 地 区 设 为 English( Unitied States) 时, 显 示 的 图 片 为 默 认 的 图 片
语 言 设 为 中 文 ( 简 体 ) 时, 显 示 的 图 片 为 sharpandroid 图 片 将 drawable-en-rus-hdpi 文 件 夹 下 的 原 来 的 sharpandroid.png 文 件 删 除, 将 icon.png 重 命 名 为 sharpandroid.png 重 命 名 方 式 为 在 其 文 件 上 点 击 F2 快 捷 键 如 下 图 所 示 将 drawable-zh-rcn-hdpi 文 件 夹 下 的 icon.png 文 件 删 除 国 际 化 图 片 文 件 包 创 建 完 成 当 然 res 下 的 其 他 资 源, 如 layout 等 也 可 以 完 成 国 际 化, 方 式 与 文 字 图 片 国 际 化 方 式 基 本 一 致 第 三 步 执 行 程 序 执 行 程 序, 此 时 手 机 系 统 上 的 语 言 地 区 为 中 国 运 行 效 果 如 下 图
相 应 的 打 开 抽 屉, 里 面 的 显 示 方 式 为 下 图 : 以 上 之 文 字 来 自 于 values-zh-rcn 文 件 夹 下 的 strings.xml 文 件 中 以 上 之 图 片 来 自 于 drawable-zh-rcn-hdpi 文 件 夹 下 的 sharpandroid.png 文 件 将 系 统 的 语 言 更 换 为 English(Unitied States), 步 骤 如 下, 先 进 入 抽 屉, 再 打 开 设 置 之 后 如 下 图
再 返 回 主 界 面, 打 开 抽 屉, 查 看 该 应 用 的 图 标 及 标 题, 如 下 图
点 击 打 开 该 程 序, 其 界 面 如 下 : 以 上 之 文 字 来 自 于 values-en-rus 文 件 夹 下 的 strings.xml 文 件 中 以 上 之 图 片 来 自 于 drawable-en-rus-hdpi 文 件 夹 下 的 sharpandroid.png 文 件 最 后 补 充 一 点, 如 果 没 有 对 应 的 国 家 的 values drawable 包, 如 没 有 values-en-rus, 那 么 默 认 会 使 用 values 包 下 的 内 容 Android 中 的 显 示 单 位 1.5 程 序 界 面 自 动 适 应 屏 幕 分 辨 率 Android 中 的 显 示 单 位 应 该 有 所 了 解, 作 如 下 简 介 : px (pixels) 像 素 一 般 HVGA 代 表 320x480 像 素, 这 个 用 的 比 较 多 dip 或 dp (device independent pixels) 设 备 独 立 像 素 这 个 和 设 备 硬 件 有 关, 一 般 为 了 支 持 WVGA HVGA 和 QVGA 推 荐 使 用 这 个, 不 依 赖 像 素 sp (scaled pixels best for text size) 比 例 像 素 主 要 处 理 字 体 的 大 小, 可 以 根 据 系 统 的 字 体 自 适 应 下 面 几 个 不 太 常 用 : in (inches) 英 寸 mm (millimeters) 毫 米 pt (points) 点,1/72 英 寸 为 了 适 应 不 同 分 辨 率, 不 同 的 像 素 密 度, 推 荐 使 用 dip, 文 字 使 用 sp 为 不 同 分 辨 率 的 手 机 创 建 界 面 仍 然 在 HelloWorld 项 目 中 进 行 改 进 首 先 进 入 res 文 件 夹 下
创 建 一 个 名 为 layout-320x240 文 件 夹, 其 中 320x240 是 屏 幕 分 辨 率 的 大 小, 值 得 注 意 的 是 分 辨 率 中 大 的 数 字 必 须 写 到 前 面, 否 则 会 产 生 语 法 错 误 如 layout-240x320 的 写 法 是 错 误 的 编 写 main.xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="320x240" /> </LinearLayout> 再 创 建 一 个 文 件 夹 layout-480x320
编 写 main.xml 文 件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <TextView android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="480x320" /> </LinearLayout> 执 行 程 序 为 了 显 示 效 果, 我 们 再 创 建 一 个 AVD QVGA240x320, 分 辨 率 为 320x240 将 sharp 的 文 字 调 为 中 文, 将 项 目 发 布 到 sharp 上, 运 行 结 果 如 下 图 :
启 动 QVGA240x320: 将 项 目 发 布 上 去 结 果 如 下 图 :
如 此 实 现 了 对 不 同 分 辨 率 的 手 机 显 示 不 同 的 界 面 1.6 Android 样 式 和 主 题 (style&theme) 或 许 你 对 默 认 的 样 式 和 主 题 不 是 那 么 满 意 为 了 解 决 这 个 问 题, 你 可 以 创 建 自 己 的 风 格 和 主 题 风 格 是 一 套 包 含 一 个 或 多 个 格 式 化 属 性 的 整 体, 你 可 以 把 它 们 加 诸 于 你 布 局 中 的 单 个 元 素 之 上 比 如, 你 可 以 定 义 一 个 包 含 特 定 文 本 字 体 大 小 和 颜 色 的 风 格, 并 将 它 单 独 施 用 于 特 定 的 视 图 元 素 主 题 也 是 一 套 包 含 一 个 或 多 个 格 式 化 属 性 的 整 体, 但 却 应 用 于 一 个 应 用 程 序 中 的 所 有 Activity, 或 单 独 一 个 Activity 比 如 说, 你 可 以 定 义 一 个 包 含 了 特 定 窗 口 边 框 颜 色 和 版 面 背 景 以 及 一 套 字 体 大 小 和 菜 单 颜 色 的 主 题 这 个 主 题 可 以 用 于 特 定 的 Activity 或 整 个 应 用 程 序 风 格 与 主 题 隶 属 于 资 源 Android 提 供 了 一 些 默 认 的 风 格 和 主 题 供 你 使 用, 你 也 可 以 定 制 你 自 己 的 风 格 和 主 题 资 源 Android 中 的 样 式 和 CSS 样 式 作 用 相 似, 都 是 用 于 为 界 面 元 素 定 义 显 示 风 格, 它 是 一 个 包 含 一 个 或 者 多 个 view 控 件 属 性 的 集 合 如 : 需 要 定 义 字 体 的 颜 色 和 大 小 在 CSS 中 是 这 样 定 义 的 : <style>.sharp{color:#0000cc;font-size:18px;} </style> 可 以 像 这 样 使 用 上 面 的 CSS 样 式 : <div class="sharp"> Android 样 式 和 主 题 (style&theme)</div> 在 Android 中 可 以 这 样 定 义 样 式 : 在 res/values/styles.xml 文 件 中 添 加 以 下 内 容 : <?xml version="1.0" encoding="utf-8"?> <resources> <style name= sharp > <!-- 为 样 式 定 义 一 个 全 局 唯 一 的 名 字 --> m name="android:textsize">18px</item> <!-- name 属 性 为 样 式 要 用 在 的 View 控 件 特 有 的 属 性 --> <item name="android:textcolor">#0000cc</item> </style> </resources> 在 layout 文 件 中 可 以 像 下 面 这 样 使 用 上 面 的 Android 样 式 : <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"...> <TextView style="@style/sharp"... />
</LinearLayout> 1.6.1 为 HelloWorld 应 用 指 定 样 式 在 HelloWorld 项 目 res/values 文 件 夹 中 的 创 建 如 下 文 件 创 建 文 件 方 式 如 下 : 文 件 的 名 称 可 以 根 据 喜 好 而 定 并 无 严 格 要 求 只 需 要 以.xml 结 尾, 且 符 合 命 名 规 范 即 可
编 写 style.xml: <?xml version="1.0" encoding="utf-8"?> <resources> <style name="sharp"> <!-- 为 样 式 定 义 一 个 全 局 唯 一 的 名 字 --> <item name="android:textsize">18px</item> <!-- name 属 性 为 样 式 要 用 在 的 View 控 件 持 有 的 属 性 --> <item name="android:textcolor">#0000cc</item> </style> </resources> 本 例 仅 仅 指 定 了 两 个 属 性 的 值, 实 际 应 用 中 可 以 把 自 己 关 心 的 重 复 较 多 的 属 性 都 在 此 定 义 在 layout-480x320 中 main.xml 的 标 签 中 引 用 该 样 式 代 码 如 下 : <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <TextView style="@style/sharp" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="480x320" /> </LinearLayout> 执 行 代 码 到 sharp 模 拟 器 上 效 果 如 下 : 其 显 示 风 格 与 未 引 用 style 是 不 同 的 <style> 元 素 中 有 一 个 parent 属 性 这 个 属 性 可 以 让 当 前 样 式 继 承 一 个 父 样 式, 当 前 样 式 可 以 继 承 到 父 样 式 的 值 当 然, 如 果 父 样 式 的 值 不 符 合 你 的 需 求, 你 也 可 以 对 它 进 行 修 改, 如 下 : <?xml version="1.0" encoding="utf-8"?> <resources> <style name="sharp"> <item name="android:textsize">18px</item> <!-- name 属 性 为 样 式 要 用 <item name="android:textcolor">#0000cc</item> </style> <style name="subsharp" parent="@style/sharp"> <item name="android:textcolor">#ff0000</item> </style> </resources> 在 的 View 控 件 特 有 的 属 性 -->
1.6.2 为 应 用 指 定 主 题 Android 中 主 题 也 是 用 于 为 应 用 定 义 显 示 风 格, 它 的 定 义 和 样 式 的 定 义 相 同, 主 题 定 义 文 件 放 于 values 目 录 下, 如 下 : sharpttheme.xml <?xml version="1.0" encoding="utf-8"?> <resources> <style name= sharptheme"> <item name= android:windownotitle >true</item> <! 无 标 题 --> <item name= android:windowfullscreen >?android:windownotitle</item> <! 全 屏 显 示 --> </style> </resources> 上 面?android:windowNoTitle 中 的 问 号 用 于 引 用 在 当 前 主 题 中 定 义 过 的 资 源 的 值 下 面 代 码 显 示 在 AndroidManifest.xml 中 如 何 为 应 用 设 置 上 面 定 义 的 主 题 : <application android:icon="@drawable/icon" android:label="@string/app_name" android:theme="@style/sharptheme">... </application> 效 果 如 下, 没 有 标 题 栏, 并 且 全 屏 显 示 : 除 了 可 以 在 AndroidManifest.xml 中 设 置 主 题, 同 样 也 可 以 在 代 码 中 设 置 主 题, 如 下 : settheme(r.style.sharptheme); 尽 管 在 定 义 上, 样 式 和 主 题 基 本 相 同, 但 是 它 们 使 用 的 地 方 不 同 样 式 用 在 单 独 的 View, 如 : EditText TextView 等 ; 主 题 通 过 AndroidManifest.xml 中 的 <application> 和 <activity> 用 在 整 个 应 用 或 者 某 个 Activity, 主 题 对 整 个 应 用 或 某 个 Activity 进 行 全 局 性 影 响 如 果 一 个 应 用 使 用 了 主 题, 同 时 应 用 下 的 view 也 使 用 了 样 式, 那 么 当 主 题 与 样 式 属 性 发 生 冲 突 时, 样 式 的 优 先 级 高 于 主 题 另 外 android 系 统 也 定 义 了 一 些 主 题, 例 如 :
<activity android:theme= @android:style/theme.dialog >, 该 主 题 可 以 让 Activity 看 起 来 像 一 个 对 话 框, 如 果 需 要 查 阅 这 些 主 题, 可 以 在 文 档 的 reference >android >R.style 中 查 看