https://www.cnblogs.com/xiaxveliang/archive/2020/03/02/12395922.htmlhtml
瞭解深色主題如何應用,第一手資料是 官方文檔 與 相應的 Google Samplejava
官方文檔:DayNight — Adding a dark theme to your app:
https://medium.com/androiddevelopers/appcompat-v23-2-daynight-d10f90c83e94
官方文檔:Dark theme:
https://developer.android.com/preview/features/darktheme
官方案例:android-DarkTheme
https://github.com/googlearchive/android-DarkTheme
android
從Support Library 23.2.0 開始,AppCompat 新增了主題:Theme.AppCompat.DayNight
git
深色主題
和 亮色主題
之間切換OLED顯示屏
的設備上,深色主題
較亮色主題
有更加持久的續航能力)而從Android Q(10.0)開始,Android設置中新增 深色主題背景
切換按鈕(設置-顯示-深色主題背景)。
所以Android App支持夜間模式,需提上開發日程了...
github
APP主題需繼承Theme.AppCompat.DayNight
或 Theme.MaterialComponents.DayNight
,如下爲代碼舉例。app
<!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.DayNight"> <!-- Customize your theme here. --> </style>
若須要監聽系統主題,例如設置-顯示-深色主題背景 切換動做。ide
Activity添加android:configChanges="uiMode"
ui
<activity android:name=".MyActivity" android:configChanges="uiMode" />
Activity中重寫 onConfigurationChanged 方法google
/** * Android系統設置中 "設置-顯示-深色主題背景" 切換後,回調該方法 */ Override public void onConfigurationChanged(@NonNull Configuration newConfig) { super.onConfigurationChanged(newConfig); int mSysThemeConfig = newConfig.uiMode & Configuration.UI_MODE_NIGHT_MASK; switch (mSysThemeConfig) { // 亮色主題 case Configuration.UI_MODE_NIGHT_NO: break; // 深色主題 case Configuration.UI_MODE_NIGHT_YES: break; } }
App 中切換應用主題,首先需調用AppCompatDelegate.setDefaultNightMode(int mode)
方法,並調用recreate()
方法使更改生效。spa
// 切換到 深色主題 AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); // 需調用 recreate() ,從而使更改生效 recreate();
AppCompatDelegate.setDefaultNightMode(int mode)
方法有四個參數選項,具體介紹以下:
// 亮色主題 ThemeHelper.Mode.LIGHT // 暗色主題 ThemeHelper.Mode.DARK // 跟隨 系統設置(系統深色模式,則深色模式;系統淺色模式,則淺色模式) AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM // 省電模式時 深色模式;非省點模式時 淺色模式 AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY
若須要監聽App的主題變動,可重寫如下方法
/** * 回調當前應用的使用主題 */ @Override protected void onNightModeChanged(int mode) { super.onNightModeChanged(mode); switch (mode) { // 亮色主題 case AppCompatDelegate.MODE_NIGHT_NO: break; // 暗色主題 case AppCompatDelegate.MODE_NIGHT_YES: break; // 省電模式時 深色模式;非省點模式時 淺色模式 case AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY: break; // 跟隨 系統設置(系統深色模式,則深色模式;系統淺色模式,則淺色模式) case AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM: break; } }
新建values-night
文件夾
將values/styles.xml
拷貝到values-night/styles.xml
values/styles.xml
與values-night/styles.xml
主題代碼舉例以下
values/styles.xml
<resources> <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.DayNight"> <!-- Customize your theme here. --> </style> </resources>
values-night/styles.xml
<resources> <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light"> <!-- Customize your theme here. --> </style> </resources>
values/colors.xml
拷貝到values-night/colors.xml
test_text_bg
屬性的顏色值values/colors.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="colorPrimary">@android:color/white</color> <color name="test_layout_bg">@android:color/white</color> <color name="test_text">@android:color/black</color> <color name="test_text_bg">#008577</color> </resources>
values-night/colors.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="colorPrimary">@android:color/black</color> <color name="test_layout_bg">@android:color/black</color> <color name="test_text">@android:color/white</color> <color name="test_text_bg">#D81B60</color> </resources>
案例源碼下載地址:
https://github.com/AndroidAppCodeDemo/Android_Dark_Test