效果图:


本例程主要是通过下述方法来实现夜间模式切换:

需要先在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);            }        }


更多相关文章

  1. Android(安卓)使用HTTPClient调用Web请求(查询手机号码区域)
  2. Android(安卓)获取IP地址的实现方法
  3. Android(安卓)Studio下的build工具路径和设置位置
  4. android ListView 几个重要属性
  5. android评分条RatingBar自定义设置
  6. Android界面基本属性
  7. Android学习笔记(28):三种选择器DatePicker_TimePicker_NumberPi
  8. Android(安卓)应用语言设置的实现
  9. Android动态设置edittext的hint属性显示的提示文字大小

随机推荐

  1. Android listview中嵌套Checkbox的布局文
  2. Android -- ViewRoot,关于子线程刷新UI
  3. iOS vs Android 系统架构
  4. Android系统启动流程分析
  5. 分环境配置
  6. SQLite的使用
  7. Android引用ttf图标字体库
  8. Android RSA 与标准Java RSA实现区别
  9. 通读Android文档系列 THREE
  10. Android仿人人客户端