夜幕降临,他走在马路上,回想着今天发生的一切,他不敢相信事情就这样发生了。他最终还是决定拨打那个电话,掏出手机,解锁屏幕,突然一道强光从屏幕里毫无预兆的发射出来。他一个踉跄倒在了马路中央。而他身后伴随着的是一阵刺耳的刹车声。

手机被摔在一边,屏幕停留在拨号页面,白茫茫的页面。很显然,所谓的强光就是亮白的页面,这种页面在大晚上被打开,眼睛会很不适应,所以

.

.

.

.

.

.

我们来探讨一下夜间模式。

问: android夜间模式的实现有几种?

答: 有好多种。(:◎)≡

apk文件

首先我想到的是,通过下载额外的apk文件,然后在获取该apk文件中的资源文件,然后替换之。当然这种方式就不仅限于夜间模式了,可以有各种模式,也就是更换主题了。采用这种方式的,我猜有,微博和QQ。(:◎)≡

自定义View

把所有用到的view全部自定义一套,根据color和drawable命名规范,比如加_night后缀。根据当前设置的日夜间模式,在onDraw之前获取对应的color或者drawable,然后再进行绘制。采用这种方式的,我猜有,网易新闻。(:)≡

setTheme设置style

这种方式,也是我在之前项目中采取的方式。可以感受一下。

采用这种方式,你需要这样

(colors.xml)

#ffffff

#000000

然后这样

(attrs.xml)

再这样

(styles.xml)

@color/color_a

@color/color_a_night

这样

(activity_xxx.xml)

android:id="@+id/xxx"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:background="?attr/colorA"/>

如果此处你设置的background是一个drawable文件,你需要创建两个drawable文件(一个日间文件,一个带_night的夜间文件)。如果你>的这个drawable文件是个,不好意思,根据其中的种类数量,你的每种需要再double一份。

最后再这样

(xxxActivity.java)

@Override

protected void onCreate(Bundle savedInstanceState) {

...

if(!isNightMode()) {

setTheme(R.style.Theme_A);

} else {

setTheme(R.style.Theme_A_Night);

}

setContentView(R.layout.activity_xxx);

...

}

如果需要切换日夜间,先保存切换的模式,然后通过recreate()重启activity

如果需要在代码中去进行颜色设置,你可以这样

int[] attrs = { R.attr.colorA };

TypedArray ta = context.getTheme().obtainStyledAttributes(attrs);

int color = ta.getColor(ArrayUtils.indexOf(attrs, R.attr.colorA), 0);

ta.recycle();

textView.setTextColor(color);

基本的流程就是这样。不管你受没受够,反正我受够了。我就感觉自己挖了一个坑,当color和drawable越来越多,我就越陷越深,这是什么样的一种感受,没错,就是绝望。

NightModeHelper

这种方式离我即将要说的方式越来越近了,你仅需要在res目录下,再创建一个带-night后缀的values文件夹values-night,再创建一个colors.xml文件,然后创建颜色#000000,注意,这里颜色命名不用添加_night后缀,与values文件夹中的颜色命名相同即可,只是这里的色值需要更换成夜间的。

然后在xxxActivity.java中

private NightModeHelper mNightModeHelper;

@Override

protected void onCreate(Bundle savedInstanceState) {

...

mNightModeHelper = new NightModeHelper(this, R.style.Theme_A);

setContentView(R.layout.activity_xxx);

...

}

...

//需要切换的地方调用该方法

mNightModeHelper.toggle();

...

这样就成功了,节省了很多繁冗的步骤。曾经我一度以为这是我最后的救命稻草,直到我遇到了她。。。

AppCompatDelegate

AppCompatDelegate

AppCompatDelegate

重要的事情说三遍!恩,就是这个家伙,不知道什么时候(我是使用的是v23.2.0 Support包),这个家伙里面有了一个这个方法setDefaultNightMode(xxx)。这个方法可以设置四个值:

MODE_NIGHT_NO 日间模式

MODE_NIGHT_YES 夜间模式

MODE_NIGHT_AUTO 根据时间自动切换日夜间模式

MODE_NIGHT_FOLLOW_SYSTEM 默认模式,就是跟随系统的设置,据说有可能以后会在android系统设置中添加日夜间模式的设置,此时如果你的app是默认模式,会根据系统设置变化日夜间模式

怎么用这个方法呢?

只要你的activity继承AppCompatActivity,app的sdk最低版本在14以上,你在任何地方都可以调用AppCompatDelegate.setDefaultNightMode(xxx),因为这是个静态方法,设置完之后新开启的页面,都会采用新的模式。你需要在每次切换模式之后,把当前模式保存在本地,然后在下次打开app的时候,获取当前模式并调用这个方法设置一下,就可以使app保持之前的模式。

接下来怎么去自定义自己的日夜间模式呢?

方法与之前的NightModeHelper类似,创建带-night后缀的文件夹(比如:values-night),然后添加你的资源文件,资源文件需要相同的命名(比如:colors.xml),这样就把夜间资源和日间资源关联起来了。这里注意一下,如果是drawable-xxhdpi中的资源需要夜间模式,这些夜间的资源就应该放在drawable-night-xxhdpi文件夹中。这里其实灵活性很大的,比如你可以在values-night中创建一个strings.xml,实现日夜间显示不同的文本。甚至你可以在layout-night中创建一个同样名字的布局文件,实现日夜间显示不同的布局。

官方为了方便开发者,在最新的v23.2.0 Support包增加了一个Theme.AppCompat.DayNight主题,如果继承这个主题,会有一些配置好的属性,如果你喜欢官方的配色,可以考虑继承这个主题,也会省下不少功夫。

还有什么?

还有个方法也提一下,就是setLocalNightMode(xxx),同样可以设置上述提到的四个值。但是这个方法只能通过getDelegate().setLocalNightMode(xxx)调用,这个方法只对当前activity有效果,并且设置完之后需要recreate()才能使其生效。

完了没?

还没完,夜间模式还有个让人头疼的问题就是,当前页面和已经开启的页面的实时更新。之前说的这么多夜间模式方案,都是让之后新的页面获取新的资源,而旧的页面怎么办?

如果你的页面不是很复杂,那就把所有的View再重新设置一遍颜色或者图片。可以直接setTextColor(R.color.xxx) setBackground(R.drawable.xxx)。也可以自定View,重新获取一下资源文件再设置一下。这里还有个前提是,需要更新的activity都得调用getDelegate().setLocalNightMode(xxx)而不是AppCompatDelegate.setDefaultNightMode(xxx),因为后者只是更改了一个全局变量,所以并不会使资源文件立即变化。

如果你的页面很复杂,那就

.

.

.

.

.

.

recreate()吧!(:◎)≡(如果你有好的方案,也特别希望你能告知我一下!)

他没办法起身,强忍着疼痛,挪动这身体,缓缓的拿起手机。从车上走出来的司机,就在一旁目睹这一切,心想,这年头碰瓷越来越有水平了。颤巍巍的双手触摸着手机屏幕,他最终还是拨打了那个号码,110。司机越来越看不明白,只感觉这套路很深

.

.

.

.

.

.

“喂!是110吗?我钥匙丢家里了,你能找人帮忙开一下吗?”

android自动夜间模式,夜晚的故事(android夜间模式实现)相关推荐

  1. Android自动股票,腾讯股票自选股 Android 版上线 - YangJunwei

    腾讯自选股Android1.0版全新发布.进入3G时代,手机炒股正成为一种时尚,为越来越忙碌的大众提供了一款超级便捷的投资工具.自选股Android1.0版是腾讯继自选股iPhone1.0版.自选股w ...

  2. android 自动创建ap,Best WIFI 让 Android 自动连接到信号较强的 AP(Wifi 无线网络基地台)...

    如果你家里是好几层楼的透天厝或者房间数量较多.使用多台 Wifi 无线网络基地台来上网,可能常常会发现当你拿着手机从客厅走到卧室或厨房时,虽然已经换到另外一个基地台的收讯范围,但手机并不会很聪明地自动 ...

  3. android自动打开apk文件失败,【Android】DownloadManager 打开url下载的APK文件无法打开的问题 cannot open file...

    问题如标题 想用浏览器下载,或者下载器下载 应用场景有以下几种: 1.监控DownloadManager,文件下载完成时以文件路径的形式发送intent: // install work Intent ...

  4. android 自动加载下一页,Android PullToRefresh下拉到底部自动加载下一页

    有时候我们想要修改pullToRefresh直接拉到底部的是否自动加载下一页的东西这里有个方法可以供大家参考 private void scrollToBottom() { mListView.set ...

  5. android 自动休眠时间设置在哪里,Android休眠设置时间

    转自  http://m.blog.csdn.net/blog/song_shi_chao/23365243 /** * 获得休眠时间 毫秒 */ private int getScreenOffTi ...

  6. android 屏幕旋转流程,android自动屏幕旋转流程分析.doc

    android自动屏幕旋转流程分析.doc android自动屏幕旋转流程分析 在android设置(Settings)中我们可以看到显示(display)下有一个自动屏幕旋转的checkbox, 如 ...

  7. Android自动连接指定的WiFi热点

    Android自动连接指定的WiFi热点 "Android自动连接指定的WiFi热点",看上去这是个再基础不过的功能了.很多人都觉得很简单,网上也有大量的资料.但在以Android ...

  8. android自动夜间模式,Android实现日夜间模式的深入理解

    在本篇文章中给出了三种实现日间/夜间模式切换的方案,三种方案综合起来可能导致文章的篇幅过长,请耐心阅读. 1.使用 setTheme的方法让 Activity重新设置主题: 2.设置 Android ...

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

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

最新文章

  1. 迷倒高斯、费马、欧拉的女王,竟是低调的她
  2. What is mobile platform?
  3. 深度优先搜索找迷宫的出路
  4. 比较两个ListT是否相同
  5. lucene 自定义评分
  6. VTK:Rendering之Cone3
  7. 修改SDE中自动生成的web.xml文件
  8. 14-多对多关系建表
  9. 三款免费的PHP加速器:APC、eAccelerator、XCache比较
  10. javaJSON字符串转换实体类
  11. 期货反跟单软件介绍与反跟单交易中的骗局
  12. 视频压缩工具及使用方法
  13. Sphero SPRK+,和星战的 BB-8 一样,这个球也是机器人 | 新玩意 · Apple Store
  14. 火狐书签栏 谷歌_适用于Firefox的Google工具栏等
  15. java去掉标点符号_java去除空格、标点符号的方法实例
  16. echarts配置项图文介绍——xAxis
  17. 男孩子读博士的十大好处
  18. 快看世界公布“神笔马良”工程 国漫借AI技术走向世界
  19. 行人重识别实验笔记2-mmdetection代码配置(人体骨架结构分析)
  20. android:声音合成之TTS

热门文章

  1. Matlab按照二进制读写txt文件
  2. 【日拱一卒行而不辍20220921】自制操作系统
  3. 李航统计学习方法笔记——泛化误差上界
  4. Linux面试题总结
  5. python爬虫面试题集锦及答案
  6. Termux基础教程(无编程基础动图展示版)
  7. 货币金额大写格式(银行需要)
  8. C++枚举类型实验:三色球问题
  9. Springboot毕设项目大学生科技项目管理系统0zzjj(java+VUE+Mybatis+Maven+Mysql)
  10. python渲染光线_Python光线追踪