前言: 爲何會選這個話題php
因爲項目老舊,項目裏留存了不少古董玩意兒,既然看到了不爽的地方,身爲程序員強烈的責任感,不得不進行改造,今天就來講說統一 Android Theme 中遇到的那些事兒android
咱們都知道 Android 系統有很嚴重的碎片化問題,最明顯的表象是手機系統升級大多數不能超過兩代,什麼意思呢?git
簡單說就是老機器買來是 5.0 系統,基本升不到 8.0 系統或更高。程序員
可能緣由有不少,鄙人也不敢隨便揣測,那麼過程當中呢,出現了各類 AppCompat suppor包, 這些包爲開發 app 帶來兼容體驗,github
固然過程當中可能發現兼容包有些不可控了,因此如今的主推的是 AndroidX,萬劍歸宗的感受。app
那麼Theme 跟這個碎片化有什麼關係呢?工具
Theme 也通過了幾個版本的流行時代,普通 theme 的寫法以下spa
@android:style/Theme.xxx
複製代碼
4.0 以後流行起了 Materail Design
, Android 系統中也默認自帶了 themecode
@android:style/Theme.Material.xxx
複製代碼
5.0後推出了 appcompat-v7 中的 themexml
@style/Theme.AppCompat.xxx
複製代碼
項目中使用的是最普通的 theme,不支持沉浸式,不支持繼承自 AppCompatActivity,也會影響部分系統的導航鍵層級(實測 MUI系統中使用普通 theme 導航鍵永遠處於 window 的最上層)
把 styles.xml
中 parent
引用自 @android:style/Theme.xxx
所有替換爲@style/Theme.AppCompat.xxx
這裏可使用as的
ctrl + R
進行快捷全局替換
在base theme中添加以下屬性:
<style name="AppBaseTheme" parent="@style/Theme.AppCompat.Light.NoActionBar"> <item name="android:windowNoTitle">true</item> <item name="colorPrimary">#ffffff</item> <item name="colorPrimaryDark">#ffffff</item> <item name="android:statusBarColor">#ffffff</item> <item name="android:windowLightStatusBar">true</item> <!-- 項目中button不規範使用會形成樣式變形,這裏把button樣式覆蓋爲最普通的樣式,以免老代碼樣式走樣--> <item name="android:buttonStyle">@android:style/Widget.Button</item> </style>
複製代碼
由於 app 中頁面頭部皆爲白色,因此把狀態欄屬性改成白色
順手作了下冷啓動的 theme, 設置在 SplashActivity 上
<style name="SplashTheme" parent="AppBaseTheme"> <item name="android:windowBackground">@drawable/splash_bg</item> <item name="android:windowLightStatusBar">false</item> <!-- 該屬性解決某些系統上layer-list bottom屬性看上去失效,其實是沒算上虛擬導航欄的高度 --> <item name="android:windowDrawsSystemBarBackgrounds">false</item> </style>
複製代碼
drawable/splash_bg.xml
文件:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<color android:color="@android:color/white" />
</item>
<!-- @dimen/hj_dp_45 是 logo 距離底部的 margin, 這裏把尺寸跟開屏頁的 logo 底部 margin 設爲一致, 平滑過渡讓用戶看上去不會奇怪 @drawable/splash_logo 是公司 logo -->
<item android:bottom="@dimen/hj_dp_45" android:gravity="bottom">
<bitmap android:gravity="bottom|center_horizontal" android:src="@drawable/splash_logo" />
</item>
</layer-list>
複製代碼
若是不出意外的話,as 已經開始報紅色波浪線了,由於styles.xml
中某些屬性會有系統兼容的問題,這時候用文件夾兼容方式解決
res
下建立文件夾values-v21
及 values-v23
-v21
就表明5.0系統會使用該文件夾下的 values
配置-v23
表明6.0系統會使用文件夾下的 values
配置values
配置,5.0 - 5.1 選擇 values-v21
配置, 6.0+ 會選擇values-v23
配置固然這些操做能夠用as 中解決問題快捷鍵 alt + enter
來自動建立對應的樣式
這樣作了之後,還會出現 5.0系統狀態欄白底色把文字顏色混合,致使看不到文字,直接改爲黑色:
<style name="AppBaseTheme" parent="@style/Theme.AppCompat.Light.NoActionBar"> <item name="android:windowNoTitle">true</item> <item name="colorPrimary">#ffffff</item> <item name="colorPrimaryDark">#ffffff</item> <item name="android:statusBarColor">#000000</item> <item name="android:buttonStyle">@android:style/Widget.Button</item> </style>
複製代碼
對 Theme
的折騰至此告一段落了, 固然若是你的項目中對於每一個界面還須要特別細分,好比說狀態欄顏色,沉浸式要求。
那麼我推薦你一款開源的工具
應該能夠知足大部分開發者的要求
最後謝謝老鐵的閱讀