Android夜间模式实现(系统自带)
16lz
2022-04-12
效果图:
本例程主要是通过下述方法来实现夜间模式切换:
需要先在res路径下创建路径:values-night,拷贝values下的colors.xml到values-night下,修改对应的色值即可。
android.support.v7.app.AppCompatDelegate.AppCompatDelegate.setDefaultNightMode(int mode);方法来设置系统默认白天与夜间模式。
调用此方法后不会立即生效,还需要调用recreate()方法后才会生效,重启Activity后会导致页面数据丢失,所以在进行切换时注意保护现场数据,以便恢复。
退出应用后,下次打开APP时,可在Application进行判断是否设置过夜间模式,再调用 AppCompatDelegate.setDefaultNightMode(int mode);
让设置在整个应用中全部生效。
本例程简单四步实现:
1、添加values-night资源文件夹,拷贝values下的colors.xml到values-night下,修改色值
(1)、values下的colors.xml
<?xml version="1.0" encoding="utf-8"?> #3F51B5 #303F9F #FF4081 #DDDDDD #9C9C9C
(2)、values-night下的colors.xml
<?xml version="1.0" encoding="utf-8"?> #333333 #666666 #DDDDDD #666666 #FFFFFF
2、点击设置按钮时调用的关键代码如下:
/***点击事件 **/SettingActivity sa_btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //记录设置时间 SharedPreferencesUtil.setLong(SettingsActivity.this, Constant.KEY_SYS_NIGHT_MODE_TIME, new Date().getTime()); if ((getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES) { AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); SharedPreferencesUtil.setBoolean(SettingsActivity.this, Constant.KEY_SYS_NIGHT_MODE, false); } else { //此方法只针对当前Activity有效,所以要让其他Activity生效,须调用recreate 才行 AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); SharedPreferencesUtil.setBoolean(SettingsActivity.this, Constant.KEY_SYS_NIGHT_MODE, true); } //切换动画在7.0不生效 //getWindow().setWindowAnimations(R.style.WindowAnimationFadeInOut); //配置夜间模式后需要调用此方法才能生效 recreate(); //EventBus通知首页更新主题 EventBus.getDefault().post(new MainEvent(1)); } });
3、通知其他Activity同时更新:
@Subscribe public void onEventMainThread(MainEvent event) { if (event.getMessage() == 1) { //通知时,如果发现本次设置夜间模式的时间与上次设置的时间不同,则进行夜间模式判断;此判断貌似有点多余。 if (SharedPreferencesUtil.hasKey(this, Constant.KEY_SYS_NIGHT_MODE_TIME) && MyApplication.sys_night_mode_time != SharedPreferencesUtil.getLong(this, Constant.KEY_SYS_NIGHT_MODE_TIME, 0)) { if (SharedPreferencesUtil.hasKey(this, Constant.KEY_SYS_NIGHT_MODE)) { if (SharedPreferencesUtil.getBoolean(this, Constant.KEY_SYS_NIGHT_MODE, false)) { AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); } else { AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); } } //切换动画在7.0不生效 //this.getWindow().setWindowAnimations(R.style.WindowAnimationFadeInOut); recreate(); } } }
4、APP启动时在Application中应用设置的模式:
sys_night_mode_time = SharedPreferencesUtil.getLong(this, Constant.KEY_SYS_NIGHT_MODE_TIME, 0); //如果切换过夜间模式那么时间不会为0,防止无用的判断 if (sys_night_mode_time != 0) { if (SharedPreferencesUtil.getBoolean(this, Constant.KEY_SYS_NIGHT_MODE, false)) { AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); } else { AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); } }
更多相关文章
- Android(安卓)使用HTTPClient调用Web请求(查询手机号码区域)
- Android(安卓)获取IP地址的实现方法
- Android(安卓)Studio下的build工具路径和设置位置
- android ListView 几个重要属性
- android评分条RatingBar自定义设置
- Android界面基本属性
- Android学习笔记(28):三种选择器DatePicker_TimePicker_NumberPi
- Android(安卓)应用语言设置的实现
- Android动态设置edittext的hint属性显示的提示文字大小