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