# Android - Dark Mode [TOC] # 系統深色模式 深色主題僅適用於搭載 API 28 (Android 9) 或 API 29 (Android 10) 以上版本的裝置或模擬器 ## Manifest 設定接UIMode (做應用內切換時不需設定接系統) 設定避免系統重啟 `android:configChanges="uiMode"` ,透過`onConfigurationChanged(@NonNull Configuration newConfig)` ,接獲自行處理,不走透過系統的方式。 ### 遇到問題 1. **不設定為什麼不會重啟?** > 💡 需要吃系統的設定才會重啟 > uiManager(MODE_NIGHT_AUTO)、 AppCompatDelegate(MODE_NIGHT_FOLLOW_SYSTEM) 2. 設定APP自行切換 **Light**: MODE_NIGHT_NO、**Dark**: MODE_NIGHT_YES,又設定configChanges接系統變更,會出現黑白異常? > 💡 已設定自行切換時,不須設定接獲系統變更,就不會影響APP內的darkMode,無設定吃系統時不會重啟。 ## 檢查手機支援可切換顏色差異設定 [Github DarkModeDemo 過渡期的判斷](https://github.com/Quuanna/DarkModeDemo) ## Change themes in-app ### **更改應用程式的主題選項** * Light * Dark * System default (官方建議預設選項) ### **這些選項直接對應到 AppCompat.DayNight 模式** - Light: [`MODE_NIGHT_NO`](https://developer.android.com/reference/androidx/appcompat/app/AppCompatDelegate#MODE_NIGHT_NO()). - Dark: [`MODE_NIGHT_YES`](https://developer.android.com/reference/androidx/appcompat/app/AppCompatDelegate#MODE_NIGHT_YES()). - System default: [`MODE_NIGHT_FOLLOW_SYSTEM`](https://developer.android.com/reference/androidx/appcompat/app/AppCompatDelegate#MODE_NIGHT_FOLLOW_SYSTEM()) ### **切換主題API版本使用差異** - **在 API 31 及以上,使用 [`UiModeManager#setApplicationNightMode`](https://developer.android.com/reference/android/app/UiModeManager#setApplicationNightMode(int)) 讓系統知道應用程式運行什麼主題,讓系統在啟動畫面期間匹配主題。** * MODE_NIGHT_YES * MODE_NIGHT_NO * MODE_NIGHT_FOLLOW_SYSTEM - **在 API 30 及以下, 使用 [`AppCompatDelegate.setDefaultNightMode()`](https://developer.android.com/reference/androidx/appcompat/app/AppCompatDelegate#setDefaultNightMode(int)) 切換主題**. * MODE_NIGHT_AUTO * MODE_NIGHT_CUSTOM * MODE_NIGHT_NO * MODE_NIGHT_YES ## 根據版本判斷後實測手機狀況 ### 問題情境 > 💡 在APP內開啟DarkMode,再去調動系統,App內configChanges接uiMode的調整,進而影響DarkMode ### 手機版本 Android 6 (不受系統影響) Android 7 (不受系統影響) Android 8 (不受系統影響) Android 9 (API 28) 系統有深色主題設定 (使用uiModeManager 切換部分廠牌失效) Android 10 (API 29) Android 11 (API 30) Android 12 (API 31) ### 不同版本使用判斷 * Android 12 以上:uiModeManager?.setApplicationNightMode * Android 9 ~ Android 11:AppCompatDelegate.setDefaultNightMode * Android 4 ~ Android 8:uiModeManager?.nightMode ### Theme style 會顯示預設[**啟動畫面**](https://www.notion.so/B-App-startup-time-3ce2e0c7a0ff4b4283727b912f9ae634?pvs=21) * Android 11 * Android 9 (API 28) * Android 10 (API 29) ## 遇到問題的議題 1. 觸發系統相關時會導致DarkMode 的畫面顏色異常,應用內切換不會在onConfigurationChanged中去接到uiMode的系統事件。[ Issue Tracker](https://issuetracker.google.com/issues/182551474)(關閉) ### 解決bug1:切換夜間模式後返回 MainActivity 頁面沒有更新 💡 做app整個重啟、reCreate頁面重啟 ### 解決bug2:重啟MainActivity時會白屏一瞬間 💡 UI 結構有關,Activity onCreate 還未完成前會先加載預設系統顏色,關閉掉初始化完成之前展示的默認的window(也就是白屏),實現秒開效果。  ### 解決bug3 : 切換模式後,部分設備左滑直接返回到設備主頁面了 💡 onBackPasss() 方法中寫上設定即可 ### Android 9 ~Android 11 的 launcher windowBackground 不支援應用內變更DarkMode,會吃系統 💡 Android 9 ~ Android 11 應用設定頁間模式,而APP啟動時會出現白色的Logo頁面,目前無法跟著變更顏色。[可參考處理方法](https://blog.csdn.net/Jason_Lee155/article/details/129274959?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EYuanLiJiHua%7EPosition-2-129274959-blog-86377066.235%5Ev36%5Epc_relevant_anti_vip_base&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EYuanLiJiHua%7EPosition-2-129274959-blog-86377066.235%5Ev36%5Epc_relevant_anti_vip_base&utm_relevant_index=5) # 參考網址 : * [Android日间模式夜间模式切换](https://reurl.cc/qkM330) * [UI 結構圖](https://blog.csdn.net/T_double/article/details/105662992) * [Change themes in-app](https://developer.android.com/develop/ui/views/theming/darktheme#change-themes) ---
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up