最近项目中要实现夜间模式,调研了几种Android的夜间模式实现方式,都是需要动态的改变ui界面引用到color、drawable等资源文件。由于这个项目是迭代了比较多版本的,ui界面比较多,项目也比较大了要每个界面都去重新梳理一遍字体颜色的改变逻辑,drawable资源的引用逻辑这个工作量是很大的,但是没办法要实现不同的界面风格这个工作是一定要做的。有一些夜间模式的实现方式是通过下载zip包来拿到不同的皮肤资源,有些是通过下载apk文件再拿到它的context获取里面drawable等资源。这些都需要自己去另外写资源的下载和加载逻辑,当然这种实现方式可以更换多种皮肤,如果是项目从0到1开始开发这种方式是不错的。但是考虑到时间成本就选了使用Support Library包中添加的夜间模式主题,简单粗暴。

首先activity继承于AppCompatActivity ,然后将style.xml中的主题样式改为Theme.AppCompat.DayNight,最后就是在application中调用AppCompatDelegate.setDefaultNightMode(int mode)设置日夜间模式,其中mode 有4个值可选分别是:
                    MODE_NIGHT_NO: 使用亮色(light)主题,不使用夜间模式
                    MODE_NIGHT_YES:使用暗色(dark)主题,使用夜间模式
                    MODE_NIGHT_AUTO:根据当前时间自动切换 亮色(light)/暗色(dark)主题
                    MODE_NIGHT_FOLLOW_SYSTEM(默认选项):设置为跟随系统,通常为 MODE_NIGHT_NO
   接下来就是苦逼的更换资源工作了。需要在对应的资源目录下创建-night目录,如:drawable 对应夜间模式 drawable-night,value对应夜间模式 value-night,而且里面的item项的文件名要一致。

在调用AppCompatDelegate.setDefaultNightMode(int mode)更改模式后需要调用recreate()方法才会生效,这时候会有个坑,就是会闪屏。像华为荣耀这些手机会闪的很厉害,小米会相对好点。后来想了个掩盖闪屏的方案,在调用recreate()方法前先打开一个半透明的activity,然后延迟1s左右消失,给它一个透明度渐变消失的动画,效果还不错。如下面的代码:

if (isNightMode != VoiceApplication.getInstance().isAppNightMode()) {startActivity(new Intent(this, NightModeChangeMaskActivity.class));overridePendingTransition(R.anim.alpha_in, R.anim.alpha_out);recreate();isNightMode = VoiceApplication.getInstance().isAppNightMode();}
public class NightModeChangeMaskActivity extends BaseActivity {@Overrideprotected int getStatusBarColorRes() {return R.color.night_mode_mask_color;}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_night_mode_change_mask);Single.timer(1000, TimeUnit.MILLISECONDS, AndroidSchedulers.mainThread()).compose(bindUntilEvent(ActivityEvent.DESTROY)).subscribe(aLong -> {finish();});}@Overrideprotected void onDestroy() {super.onDestroy();}@Overridepublic void finish() {super.finish();overridePendingTransition(0, R.anim.alpha_out);}
}

这里主要是记录下实现夜间模式的实现方式和日夜间解决切换时闪屏的解决方案,做个笔记吧。

Android一种实现夜间模式方式,同时解决调用recreate() 时闪屏问题相关推荐

  1. android support library github,Android Support Library 之 夜间模式

    原标题:Android Support Library 之 夜间模式 前言 夜间模式实现方式:1.通过切换theme来实现夜间模式.优点:可以匹配多套主题,并不局限于黑白模式缺点:需要大量定义主题详见 ...

  2. android 夜间模式代码,Android 超简单的夜间模式如何实现?

    原标题:Android 超简单的夜间模式如何实现? 本文作者 作者: 唐子玄 实现夜间模式有很多种方式,经过多次尝试,算是找到了一种性价比较高的方式. 1 主题方式 这是最正统的方式,但工作量巨大,因 ...

  3. android+闪屏启动优化,Android分享笔记(2) APP启动时闪屏

    App在启动时,即在欢迎界面.老是出现白屏或黑屏,闪一下然后才出现欢迎界面. 我欢迎界面原先是这样的:<?xml  version="1.0" encoding=" ...

  4. android studio夜间模式,android studio怎样实现夜间模式

    满意答案 noxlqub 2016.05.01 采纳率:51%    等级:7 已帮助:210人 关于阅读类的app,有个夜间模式真是太重要了. 那么有两种方式可以实现夜间模式 1:修改theme,重 ...

  5. android 夜间模式源码,Android Support Library 之 夜间模式

    前言 夜间模式实现方式:1.通过切换theme来实现夜间模式.优点:可以匹配多套主题,并不局限于黑白模式缺点:需要大量定义主题详见博客:http://wuxiaolong.me/2015/08/19/ ...

  6. Win10夜间模式无法关闭解决方法

    Win10夜间模式开启后有时会出现无法关闭的问题,进入系统设置点击关闭也无效. 解决方法 按下Win+R键,输入"regedit",点击确定打开注册表 然后打开以下路径" ...

  7. (转载)Android两种Tab分页的方式:TabActivity和ActivityGroup以及Android项目几种常见的应用架构...

    在Android里面Tab分页,常用的方法有两种: 一.TabActivity和TabHost的结合 1.主类继承TabActivity public class Tagpage extends Ta ...

  8. Android三种播放视频的方式

     分类: Android多媒体(12)  Android应用层(93)  版权声明:本文为博主原创文章,未经博主允许不得转载. 在Android中,我们有三种方式来实现视频的播放: 1.使用其自带的播 ...

  9. android 杀死后台进程,android 几种杀进程的方式

    今天在编写 application 通用组件时,需要在低内存的回调中杀死进程,所以找了下 androd 傻进程的方法,总结下来有下面几种: 根据进程名称杀进程 android.os.Process.k ...

最新文章

  1. Spark _21 _SparkSQL介绍
  2. matlab imdilate_MATLAB--数字图像处理 数学形态学应用
  3. Java——多线程(线程安全问题)
  4. GUI编程tkinter模块常用参数(python3)
  5. Objective-C的基础数据结构
  6. 大白话5分钟带你走进人工智能-第十九节逻辑回归之优化点(4)
  7. 在计算机中能不能隐藏图片,意想不到的加密方法-怎么把任意文件隐藏在图片里...
  8. 处理SQLServer死锁
  9. nanomsg项目实战
  10. java研发微博营销
  11. CPU、内存、主板、显卡等是什么?计算机基本的硬件介绍,计算机组成元件
  12. 图解LDO电路和DC-DC电路,掌握芯片选型
  13. 大数据高级开发工程师——Spark学习笔记(8)
  14. C++ STL :vector动态数组可实现整体赋值
  15. JAVA-IDEA报错:Error:Cannot run program “C:\Program Files\Java\jdk1.8.0_20\bin\java.exe“
  16. 小议技术业务孰重孰轻-既不能重文轻武,也不能重业务轻技术
  17. signature=b8cae5ae994df93c3fedf622c2a51ac5,javascript中的Base64、UTF8编码与解码详解
  18. 【老生谈算法】标准遗传算法的MATLAB实现源码——遗传算法
  19. 闪迪u盘格式化 linux,u盘 32g 闪迪cz80linux u盘挂载
  20. 经典网页布局浮动广告

热门文章

  1. 如何实现图片缩放效果?
  2. LintCode 1228. 可怜的猪 JavaScript算法
  3. AS3-45度角坐标转换
  4. word html签名,如何在Word中加入手写签名签名?
  5. 理解Barra Risk Model:Investment Tools History
  6. SPSS面积图【012-3期】
  7. IMU中地磁计的椭球面拟合标定法与C++实现
  8. PbootCMS独立插件系列之Word+Excel导入完全免费版V1.0
  9. 360手机:360N6Pro Twrp、Root、Magisk教程
  10. 实践数据湖iceberg 第五课 hive catalog特点