- 示例工程
- 教程
【免费下载链接】cw-omnibus
Source code to omnibus edition of _The Busy Coder's Guide to Android Development_
本篇技术指南以 cw-omnibus 仓库中的 StatusBarColor 示例工程 为蓝本,系统讲解如何在 Android 应用中通过appcompat-v7同时定制 Action Bar(操作栏)与设备状态栏(Status Bar)的颜色。该示例是The Busy Coder's Guide to Android Development中appcompat-v7章节(官方 ActionBar 移植版)的配套演示代码,阅读本文后,你将掌握:主题(Theme)中三个核心颜色属性的含义与取值方式、在代码中针对不同 API 级别安全设置状态栏颜色的完整写法,以及appcompat-v7依赖下主题从Theme.AppCompat继承的正确姿势。
示例工程概览:一个文件承载两个着色目标
示例工程位于 AppCompat/StatusBarColor 目录,是一个标准的 Android 应用模块(settings.gradle中仅包含:app一个模块)。它的演示目标非常明确:
- 对Action Bar(操作栏)应用自定义颜色;
- 对设备状态栏(Status Bar)应用自定义颜色。
整个工程只有一个 Activity ——ActionBarDemoActivity,界面主体是一个加载了若干单词的ListView(布局见 list_content_simple.xml,菜单见 actions.xml),演示的重点不在于列表本身,而在于窗口顶部的两层“色带”如何被统一驱动。包名com.commonsware.android.abverscolor也暗示了它的主题:ab(ActionBar)+ vers(Version,版本判断)+ color(颜色)。
主题定义:三个颜色属性驱动整套配色
appcompat-v7的着色体系基于 Material Design 的“主色”概念,通过三个主题属性即可控制全局配色。示例在 styles.xml 中定义了自己的主题:
<?xml version="1.0" encoding="utf-8"?> <resources> <style name="Theme.Apptheme" parent="Theme.AppCompat"> <item name="colorPrimary">@color/primary</item> <item name="colorPrimaryDark">@color/primary_dark</item> <item name="colorAccent">@color/accent</item> </style> </resources>三个属性的职责划分如下:
| 属性 | 作用对象 | 本示例取值 |
|---|---|---|
colorPrimary | Action Bar 背景色 | @color/primary |
colorPrimaryDark | 状态栏颜色(API 21+)与 Action Bar 的深色变体 | @color/primary_dark |
colorAccent | 控件强调色(选中态、进度条、输入框光标等) | @color/accent |
对应的颜色值定义在 colors.xml:
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="primary">#3f51b5</color> <color name="primary_dark">#1a237e</color> <color name="accent">#ffee58</color> </resources>从取值看,这是一套标准的 Material Indigo 配色:#3f51b5(Indigo 500)用于主色,#1a237e(Indigo 900)作为深色变体,#ffee58(Yellow A200)作为强调色。Action Bar 的着色完全由主题属性驱动,只要应用了这个主题,appcompat-v7就会自动把 Action Bar 背景绘制为colorPrimary,无需任何 Java 代码干预——这也是该示例与仓库中另一个仅演示 Action Bar 着色的变体 ActionBarColor 共有的核心思路。
在代码中设置状态栏颜色:API 21+ 的安全写法
Action Bar 的颜色由主题自动处理,但状态栏颜色必须由代码显式设置,而且只在 Android 5.0(API 21,Lollipop)及以上生效。示例在 ActionBarDemoActivity.java 的onCreate()中完成了这一工作:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Window window = getWindow(); window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); window.setStatusBarColor(getResources().getColor(R.color.primary_dark)); } setContentView(R.layout.list_content_simple); initAdapter();逐行拆解这段代码的意图:
- 版本判断:
Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP确保只在该 API 支持状态栏着色时执行,在旧版本设备上静默跳过,保证应用在 API 15 的minSdkVersion上也能正常安装运行。 FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS:从 API 21 起,窗口默认不再绘制系统栏(状态栏、导航栏)背景,必须显式添加该标志,setStatusBarColor()才会真正生效。它是“允许窗口绘制系统栏背景”的开关。FLAG_TRANSLUCENT_STATUS:该标志会使状态栏变为半透明效果。clearFlags()将其移除,明确要求使用不透明的实色背景,与示例期望的纯色渲染一致。这一加一清的组合是许多 Material 应用的标准写法。setStatusBarColor():传入的R.color.primary_dark与主题中的colorPrimaryDark使用同一个颜色资源,因此状态栏颜色与 Action Bar 的深色变体天然保持一致,形成“ActionBar 亮、状态栏暗”的层次感。
注意
getResources().getColor()返回 ARGB 颜色值,API 23+ 推荐用getColor(id, theme)或ContextCompat.getColor(),本示例面向当时的 Android 开发环境,写法以getColor(R.color.primary_dark)为准。
主题如何被应用:清单文件中的全局声明
主题只有在被引用时才会生效。示例在 AndroidManifest.xml 的<application>节点上声明了它:
<application android:allowBackup="false" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/Theme.Apptheme"> <activity android:name="ActionBarDemoActivity" android:label="@string/app_name"> ... </activity> </application>把android:theme放在<application>级别,意味着主题作用于整个应用的所有界面。由于Theme.Apptheme的父主题是Theme.AppCompat,Activity 继承自AppCompatActivity(见 ActionBarDemoActivity.java 的import android.support.v7.app.AppCompatActivity;与类声明),这正是appcompat-v7使用模式的完整闭环:主题继承Theme.AppCompat,Activity 继承AppCompatActivity,二者缺一不可,否则 Action Bar 将退化为系统原生样式。
工程构建前提:依赖与 SDK 版本
工程使用 Gradle 构建,应用模块的构建配置见 app/build.gradle:
apply plugin: 'com.android.application' dependencies { implementation "com.android.support:appcompat-v7:27.1.1" } android { compileSdkVersion 27 buildToolsVersion '27.0.3' defaultConfig { minSdkVersion 15 targetSdkVersion 27 } }要点说明:
appcompat-v7:27.1.1是本例 Action Bar 着色的前提依赖,Theme.AppCompat、AppCompatActivity均来自该库;由于appcompat-v7内部又依赖support-v4等基础库,构建时会被 Gradle 一并引入。compileSdkVersion 27与targetSdkVersion 27匹配依赖库的编译版本,才能解析出Theme.AppCompat中colorPrimary等属性;顶部 build.gradle 使用 Android Gradle Plugin 3.1.4,对应 Gradle 4.4(见 gradle-wrapper.properties)。minSdkVersion 15说明该示例兼容 Android 4.0.3(API 15)以上的设备,状态栏着色部分通过代码中的版本判断实现了向后兼容。值得留意的是,工程根目录的 project.properties 仍保留着旧的 Eclipse ADT 时代配置(target=android-19),而 AndroidManifest.xml 中uses-sdk也写着旧值(minSdkVersion=14、targetSdkVersion=19)——在实际 Gradle 构建中,以app/build.gradle中的defaultConfig为准。
变体对照:ActionBarColor 只着色 Action Bar
cw-omnibus 仓库中还提供了功能更窄的对照工程 ActionBarColor:它只演示appcompat-v7Action Bar 的颜色定制,主题定义与StatusBarColor完全相同(同样是Theme.AppCompat父主题 +colorPrimary/colorPrimaryDark/colorAccent,颜色值一致),但 Activity 代码中没有setStatusBarColor()相关逻辑,minSdkVersion也更低(7)。两个工程的差异恰好划出了“主题属性能覆盖什么、代码还必须做什么”的边界:
- 主题属性(
colorPrimary等)负责 Action Bar 的自动着色,两者一致; - 状态栏着色必须额外编写 API 21+ 判断与 Window Flags 操作,只有
StatusBarColor具备。
如果你只需要定制操作栏,参照ActionBarColor即可;若想让状态栏也纳入配色体系,本示例的“主题 + 代码”组合就是完整的参考实现。
延伸阅读:仓库内的配套资源
- 示例入口代码:ActionBarDemoActivity.java
- 主题与颜色定义:styles.xml、colors.xml
- 清单与构建配置:AndroidManifest.xml、app/build.gradle
- 对照工程:ActionBarColor
- 主题背景:工程
drawable目录下的*_apptheme.xml与.9.png素材(如 ab_background_textured_apptheme.xml、progress_horizontal_apptheme.xml)均出自 Android Action Bar Style Generator,用于渲染 Action Bar 各控件的按压、聚焦、选中等状态,可作为进一步定制样式的参考。
该示例的完整讲解收录于The Busy Coder's Guide to Android Development的appcompat-v7(官方 ActionBar 移植版)章节,本文内容即为该章节配套示例在仓库中的落地实现解读。
- 示例工程
- 教程
【免费下载链接】cw-omnibus
Source code to omnibus edition of _The Busy Coder's Guide to Android Development_
相关推荐
在 appcompat-v7 ActionBar 中集成 ShareActionProvider:cw-omnibus 共享操作示例深度解析
在 appcompat v7 ActionBar 中集成 ShareActionProvider:cw omnibus 共享操作示例深度解析 本篇技术指南以 c
示例工程教程在 AppCompat ActionBar 中集成 SearchView 向后移植:cw-omnibus SearchView 示例深度解析
在 AppCompat ActionBar 中集成 SearchView 向后移植:cw omnibus SearchView 示例深度解析 cw omnibu
示例工程教程cw-omnibus AppCompat/Basic 示例集:用 appcompat-v7 修订基本控件的行为与外观
cw omnibus AppCompat/Basic 示例集:用 appcompat v7 修订基本控件的行为与外观 在 cw omnibus 仓库中, App
示例工程教程
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考