《Android編程權(quán)威指南》第 21 章第一篇,主要就是給 BeatBox 界面重定制,內(nèi)容不多,將學(xué)習(xí)到 Android 主題和樣式相關(guān)的知識。
一、顏色資源
顏色資源通常統(tǒng)一放在 res/values/colors.xml 文件中進(jìn)行管理,整個(gè)應(yīng)用對它進(jìn)行引用。

顏色可以從左邊的小正方形實(shí)時(shí)看到,還挺方便。通常項(xiàng)目中會(huì)定義各種色值,還有黑夜模式的色值,會(huì)放另外一個(gè) -night 的文件夾中的 color.xml,用同一個(gè)名字,這樣主題切換到暗黑模式就自動(dòng)變化引用的色值了。跟前面做國際化方式類似做此功能。
二、樣式
樣式是能夠應(yīng)用于視圖部件的一套屬性。存放在 res/values/styles.xml 中。先添加個(gè)新樣式 BeatBoxButton。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="BeatBoxButton">
<item name="android:background">@color/dark_blue</item>
</style>
</resources>
樣式可以為很多控件共用,更改屬性時(shí),只修改公共樣式定義即可。
然后去給 Button 添加樣式。
style="@style/BeatBoxButton"
跑起來實(shí)際上依然是丑丑的,問題不大,就是為了學(xué)習(xí)嘛。
樣式繼承
樣式也支持繼承。一個(gè)樣式能繼承并覆蓋其他樣式的屬性。
比如用命名的方式繼承:
<style name="BeatBoxButton.Strong">
<item name="android:textStyle">bold</item>
</style>
或者是指定父樣式的方式繼承:
<style name="StrongBeatBoxButton" parent="@style/BeatBoxButton">
<item name="android:textStyle">bold</item>
</style>
然后繼續(xù)給 Button 設(shè)置一下體驗(yàn)一下。
三、主題
主題可看作樣式的進(jìn)化加強(qiáng)版,主題屬性會(huì)應(yīng)用于整個(gè)應(yīng)用。
打開 manifest 文件可以看到應(yīng)用默認(rèn)設(shè)置的主題:

theme 指向地方:

主題實(shí)際也是一種樣式,可見此處我的默認(rèn)的主題繼承了 Theme.MaterialComponents.DayNight.DarkActionBar,想要深入了解屬性就繼續(xù)按住 Command(Ctrl)跳轉(zhuǎn)進(jìn)入即可。
AppCompat 庫自帶三大主題:
- Theme.AppCompat——深色主題。
- Theme.AppCompat.Light——淺色主題。
- Theme.AppCompat.Light.DarkActionBar——帶深色工具欄的淺色主題。
大概目前我的項(xiàng)目比書中要新一點(diǎn),所以默認(rèn)是 MaterialComponents 庫主題,深色模式或者是亮色模式命名規(guī)則基本一致。
有關(guān) MaterialComponent 的深色主題背景 詳情請參考:
https://material.io/develop/android/theming/dark
四、添加主題顏色
可自行改成自己想要的顏色啦。
colorPrimary 屬性主要用于應(yīng)用欄。
colorPrimaryDark 用于屏幕頂部的狀態(tài)欄。
注意,只有 Lollipop 以后的系統(tǒng)支持狀態(tài)欄主題色。對于之前的系統(tǒng),無論指定什么主題色,狀態(tài)欄都是不變的黑底色。
項(xiàng)目中常常有需求需要沉浸式的狀態(tài)欄,有個(gè)沉浸式狀態(tài)欄實(shí)現(xiàn)開源項(xiàng)目推薦:
https://github.com/gyf-dev/ImmersionBar
貌似挺不錯(cuò)的。目前我在項(xiàng)目中也是用此方案來解決沉浸式狀態(tài)欄問題。
其他
BeatBox 項(xiàng)目 Demo 地址:
https://github.com/visiongem/AndroidGuideApp/tree/master/BeatBox