方式
- 不同Theme
- 第三方框架
- API 23.0.0后AppCompatDelegate
模式
AppCompatDelegate模式
MODE_NIGHT_YES 夜间
MODE_NIGHT_NO 日间
MODE_NIGHT_FOLLOW_SYSTEM 据系统设置设夜间否
MODE_NIGHT_AUTO 据当前时自换
方法
setLocalNightMode(int mode)
AppCompatDelegate中setLocalNightMode(int mode)
作用当前组件。如Application设日间而当前Activity调getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_YES)
则该Activity夜间(覆原模式)。setDefaultNightMode(int mode)
仅作用新生组件,原任务栈中Activity无效。直于Activity之onCreate()调AppCompatDelegate.setDefaultNightMode(int mode)
则Activity直接生效,无需再调recreate()
。但通监听器调则需recreate()
,否当前Activity无效(新生Activity仍有效)。
步骤
- res
内容及ID一致
主题
这里继承Theme.AppCompat.DayNight
。该主题Family含其它主题Theme.AppCompat.DayNight.DarkActionBar
、Theme.AppCompat.DayNight.NoActionBar
。<resources xmlns:tools="http://schemas.android.com/tools"> <!-- Base Application Theme --> <style name="AppBaseTheme" parent="Theme.AppCompat.DayNight"> ... </style> <style name="AppTheme" parent="AppBaseTheme" /> </resources>
- 主代码
// 设模式
setNightMode(AppCompatDelegate.MODE_NIGHT_YES);
private void setNightMode(@AppCompatDelegate.NightMode int nightMode) {
AppCompatDelegate.setDefaultNightMode(nightMode);
recreate();
}
// 据上退状判需夜间否(提前于SharedPreference存一夜间否boolean值)
boolean isNightMode ...
if (isNightMode) {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
}else {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
}