首先刚开始 我开始使用了第三方得 Android-skin-support库 因为我的项目是databinding的,升级到最新版本后 库不支持了,所以也是抛弃了,可能是因为这个库的作者工作忙或者是没有时间再去维护这个库了吧,也能理解,大家或者可以用下,也可能会遇到意想不到的问题,反正有利有弊,三思而行

我使用了原生自己切换暗黑模式

第一步 就是创建了一个Model 跟项目解耦开 避免后边改起来印象到主项目 如下图

library_skin 就是暗黑模式的资源

drawable-night 存放shape文件 有的同学放图片也是可以  那你就要创建对应的 比如 drawable-night-xhdpi文件 就是根据分辨放的图片

mipmap-night-xxxhdpi 我这边放的是图片  不用的同学可以略过

values-night 这个下边我存放的是 colors.xml 目前就是这个文件

这些颜色或者资源的名字要和你默认的资源名字或者颜色的名字保持一致 只是文件加名字加了个night

比如 默认

colors.xml

  <color name="white">#ffffff</color>

主题model的 values-night  colors.xml

    <color name="white" >#1B1C24</color>

接下来 就是监听系统切换了暗黑模式 这个我是放在BaseActivity中的 baseApplySkin这个方法就是base的一个回调 子类重写这个方法可以做一些才做

manifest要设置这个属性 你可以在你的主Activity中设置这个属性 没必要在所有的Activity上设置
 <activityandroid:name=".MainActivity"android:configChanges ="uiMode"android:screenOrientation="portrait"android:theme="@style/AppTheme.NoActionBar"tools:ignore="LockedOrientationActivity"></activity>
   @Overridepublic void onConfigurationChanged(Configuration newConfig) {super.onConfigurationChanged(newConfig);int curr = newConfig.uiMode & Configuration.UI_MODE_NIGHT_MASK;DarkModeUtils.applySystemMode(this);baseApplySkin(this);}

DarkModeUtils 切换黑暗模式 已经保存暗黑模式状态

public class DarkModeUtils {public static final String KEY_CURRENT_MODEL = "night_mode_state_sp";private static int getNightModel(Context context) {SharedPreferences sp = context.getSharedPreferences(KEY_CURRENT_MODEL, Context.MODE_PRIVATE);return sp.getInt(KEY_CURRENT_MODEL, AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);}public static void setNightModel(Context context, int nightMode) {SharedPreferences sp = context.getSharedPreferences(KEY_CURRENT_MODEL, Context.MODE_PRIVATE);sp.edit().putInt(KEY_CURRENT_MODEL, nightMode).apply();}/*** ths method should be called in Application onCreate method** @param application application*/public static void init(Application application) {int nightMode = getNightModel(application);AppCompatDelegate.setDefaultNightMode(nightMode);}/*** 应用夜间模式*/public static void applyNightMode(Context context) {AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);setNightModel(context, AppCompatDelegate.MODE_NIGHT_YES);}/*** 应用日间模式*/public static void applyDayMode(Context context) {AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);setNightModel(context, AppCompatDelegate.MODE_NIGHT_NO);}/*** 跟随系统主题时需要动态切换*/public static void applySystemMode(Context context) {AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);setNightModel(context, AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);}/*** 判断App当前是否处于暗黑模式状态** @param context 上下文* @return 返回*/public static boolean isDarkMode(Context context) {int nightMode = getNightModel(context);if (nightMode == AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM) {int applicationUiMode = context.getResources().getConfiguration().uiMode;int systemMode = applicationUiMode & Configuration.UI_MODE_NIGHT_MASK;return systemMode == Configuration.UI_MODE_NIGHT_YES;} else {return nightMode == AppCompatDelegate.MODE_NIGHT_YES;}}

mainActiviy 重写baseApplySkin

   @Overrideprotected void baseApplySkin(Activity activity) {super.baseApplySkin(activity);this.recreate();LogInputUtil.e(TAG+"执行了几次");}

main会重新创建 你要保存一些属性 在Activity重建完成一周回复之前用户的操作 比如切换tab的状态  输入框的值

我这里保存的 用户切换的tab 下标

@Overrideprotected void onSaveInstanceState(@NonNull Bundle outState) {//深色模式切换之后 activity会重新创建 记录当前选中的taboutState.putInt("clickIndex",BaseApplication.clickIndex);super.onSaveInstanceState(outState);}
 @Overrideprotected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {super.onRestoreInstanceState(savedInstanceState);if(savedInstanceState!=null){//activity重建以后 获取上次选中的tabclickIndex=savedInstanceState.getInt("clickIndex");}}

下边看下效果

效果完美 使用第三方也有不可控的风险 所以建议自己实现 可控

如果H5的适配暗黑模式的花  去看下我上一篇文章 关于H5适配暗黑的文章H5暗黑模式适配

Android 适配黑暗模式10.0 Q相关推荐

  1. Android 1.5到10.0 都有哪些新特性?

    文章转自:https://www.itcodemonkey.com/article/13183.html Android 1.5(Cupcake纸杯蛋糕): 智能虚拟键盘:使用widgets实现桌面个 ...

  2. Android 1.5 到 10.0 新特性

    Android 1.5(Cupcake纸杯蛋糕): 智能虚拟键盘:使用widgets实现桌面个性化:在线文件夹(Live Folder)快速浏览在线数据:视频录制和分享:图片上传: 更快的标准兼容浏览 ...

  3. android 取消黑暗模式

    取消黑暗模式 在你的AndroidManifest.xml文件中,在application标签下,设置全局android:theme="xxx": <style name=& ...

  4. 谷歌Chrome浏览器正式上新Android版黑暗模式

    chrome谷歌浏览器安卓版本迎来了全新的使用版本,这次不仅对于浏览器的性能进行了升级,其他方面也进行了升级使用,并且还上线了全新的"黑暗模式",相信有很多用户对这个模式已经不陌生 ...

  5. android自动切换暗色,Android 适配深色模式的总结

    Android Q 推出了深色模式,其实 Android 9 就有了,部分厂商小米,三星就在系统 Android 9 加入了深色模式的开关. Android 提供了一套夜间模式主题,继承 Theme. ...

  6. Android开发之一:10.0 USB弹窗权限流程解析

    1. 新建activity,获取UsbManager usbManager = (UsbManager) getSystemService(Context.USB_SERVICE) 2. 获取所以的U ...

  7. Android 适配暗黑模式

    在样式中添加 <style name="MyAppTheme">.......<item name="android:forceDarkAllowed& ...

  8. Android Q 强制黑暗模式(ForceDark) | 原理 实践

    搜狐技术产品(sohu-tech) | 来源 Hi,大家好,这里是承香墨影! Android Q 版本增加了 ForceDark 功能,可以快速实现应用的黑暗模式.本文主要讲述了 Android Q ...

  9. AndroidQ(10)黑暗模式适配

    前言:作为一个Android程序员,每年最期待就是Google的发布会啦!!这不,今年的AndroidQ如期而至.这里简单介绍一下Android的新特性: AndroidQ全局暗黑模式 隐私权限的更新 ...

最新文章

  1. SCCM2012R2之二安装SQL Server
  2. PHP与base64
  3. HTML 4.01 符号实体
  4. android edittext 联想,Android 输入法联想问题
  5. onvif规范的实现:成功实现ONVIF协议RTSP-Video-Stream与OnvifDeviceManager的视频对接
  6. carsim8.02和matlab2016b的联合仿真,找不到carsim s-function的解决办法
  7. Scala Akka的Actor模型
  8. msysGit管理GitHub代码
  9. c语言简单密码字符a用f代替,c语言实验.doc
  10. 狼殿下高清壁纸|不用等的好剧!
  11. 传统东方韵味尽显|国潮国风包装样机
  12. 软件测试基础:自动化测试、安全测试、性能测试
  13. 1.Chrome开发者工具不完全指南(一、基础功能篇)
  14. meshlab点云转mesh
  15. Excel 2010画箱线图 Box-Plot
  16. redis-6.2.5集群部署手册
  17. std::future、std::promise、std::packaged_task、std::async
  18. 道德引擎——灾难来临,你够资格登上诺亚方舟?墨尔本大学《java面向对象》结辩作业
  19. 路径中的“\”和“/”以及相对路径和绝对路径
  20. 11.1-股票基金历年收益率计算

热门文章

  1. mysql表关联_MySQL表关联的几种常用方式
  2. 基于jsp+mysql+ssm的爱康医院专家预约管理系统-计算机毕业设计
  3. C++常用的延时方法
  4. IFTTT的数据架构
  5. Scala学习(五)练习
  6. bootstrap手机网站H5模板固定底部顶部导航DEMO下载
  7. NLP - 词的表示:Bow,One-hot, TF-IDF,Word2VNLP
  8. java-php-python-ssm万达影院售票管理系统计算机毕业设计
  9. Objective-C分类 (category)和扩展(Extension)
  10. 不乱于心,不困于情,不畏将来,不念过往