Android白天/夜间模式Day/Night Mode标准原生SDK实现

章节A:
Android实现白天/夜间模式主要控制器在于UiModeManager,UiModeManager是Android系统SDK本来就提供好的白天/夜间模式的实现控制系统。然而仅有UiModeManager还不够,同时需要写一套白天/夜间模式的资源,涉及到res/drawable或者values/color的设置。
现在给出一个例子加以说明实现Android白天/夜间模式的具体步骤和做法。

通常,在Android显示的布局中会有一些文本或者图,这些图基本就是一些icon图标,还有整体窗口的背景颜色。一般的,白天/夜间模式涉及到的显示状态的切换最基本改变影响就是这些文本、icon图标、整体的背景颜色等。

先给出本例代码运行结果,白天模式(默认缺省的模式):

点击夜间模式按钮后切换到的夜间显示模式:

章节B:
对章节A运行结果的说明。在APP整体切换白天/夜间模式过程中,最受影响和涉及的是一些背景颜色、图片icon、文本颜色等。在章节A中的图中,从上往下顺序排列了最具有典型意义的TextView、ImageView已经整体这个布局的背景颜色。初始状态是白天模式,可以看到按钮Button和TextView的字都是白色的,那个圆球ImageView是灰色的,标题栏是蓝色。当点击夜间模式按钮,进入夜间模式后,Button,TextView的字变成白色,ImageView圆球的颜色变成白色。整体的背景颜色换成黑色。
白天和夜间模式均可自由切换,而上层Java代码再后面详细展示后实际上很简单。

章节C:
实现章节A的白天/夜间模式。具体详情:
(1)先写上层Java代码,MainActivity.java:

package zhangphil.app;

import android.app.Activity;
import android.app.UiModeManager;
import android.content.Context;
import android.os.Bundle;
import android.view.View; public class MainActivity extends Activity { //实现Android白天/夜间模式的关键类
private UiModeManager mUiModeManager = null; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); mUiModeManager = (UiModeManager) getSystemService(Context.UI_MODE_SERVICE); //点击白天模式按钮,切换到白天模式
findViewById(R.id.day).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mUiModeManager.setNightMode(UiModeManager.MODE_NIGHT_NO);
}
}); //点击夜间模式按钮,切换到夜间模式
findViewById(R.id.night).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mUiModeManager.setNightMode(UiModeManager.MODE_NIGHT_YES);
}
});
}
}

该MainActivity.java加载的activity_main.xml布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/background"
android:orientation="vertical"> <Button
android:id="@+id/night"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="夜间模式"
android:textColor="@color/text" /> <Button
android:id="@+id/day"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="白天模式"
android:textColor="@color/text" /> <ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:src="@drawable/icon" /> <TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_gravity="center_horizontal"
android:gravity="center"
android:text="白天模式/夜间模式的切换\nzhang phil @ csdn\nhttp://blog.csdn.net/zhangphil"
android:textColor="@color/text" /> </LinearLayout>

可以看到上层Java代码其实很简单,逻辑意图就是当用户点击切换白天/夜间模式后切换启动相应的逻辑。

接下去的才是关键。

(2)这一步才是实现白天/夜间模式的关键:资源文件的设置和编写。
当上层Java代码启动UiModeManager切换白天/夜间模式时候,Android系统会自动加载相应的资源。“相应的资源”是什么鬼?是res/values-night和res/drawable-night。
先说在代码中涉及到的颜色值。本例中涉及到的文本颜色值有Button和TextView,以及整体的背景颜色,这些颜色我在默认的res/values/colors.xml中已经定义,这也是默认的模式颜色:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="text">@android:color/black</color>
<color name="background">@android:color/white</color>
<color name="buttonBackground">@android:color/darker_gray</color> <color name="colorPrimary">#3F51B5</color>
<color name="colorPrimaryDark">#303F9F</color>
<color name="colorAccent">#FF4081</color>
</resources>

要做到夜间模式的颜色,我要做的就是在res目录下新建一个res/values-night目录,在values-night目录下,重新写一套colors.xml文件,在res/values-night/colors.xml文件中,将Android默认缺省的res/values/colors.xml中、自己开发的代码中涉及到属性定义再准备一套,而这套就是为夜间模式的颜色使用的,这个颜色值,将在Android系统调用setNightMode(UiModeManager.MODE_NIGHT_YES)后自动加载使用,res/values-night/colors.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="text">@android:color/white</color>
<color name="background">@android:color/black</color>
<color name="buttonBackground">@android:color/darker_gray</color> <color name="colorPrimary">@android:color/darker_gray</color>
<color name="colorPrimaryDark">@android:color/black</color>
</resources>

(3)由于受到白天/夜间模式影响的还有一些icon图片资源,仿照处理colors.xml的姿势,我再准备一套夜间模式的drawable,放到res/drawable-night中。在本例中,我放在res/drawable目录下的icon.png(白天、默认):

放在res/drawable-night目录下的icon.png(夜间):

(4)注意,res/values/colors.xml和res/values-night/colors.xml中定义的color必须同名, name相同,同理,res/drawable和res/drawable-night涉及到白天/夜间模式使用的icon图也必须同名,name相同。本例的目录结构:

代码运行结果就是章节A的结果。

附录:
1,《Android一键换肤功能:一种简单的实现》链接:http://blog.csdn.net/zhangphil/article/details/51455137

Android白天/夜间模式Day/Night Mode标准原生SDK实现的更多相关文章

  1. 【android】夜间模式简单实现

    完整代码,请参考我的博客园客户端,git地址:http://git.oschina.net/yso/CNBlogs 关于阅读类的app,有个夜间模式真是太重要了. 那么有两种方式可以实现夜间模式 1: ...

  2. Android 之夜间模式(多主题)的实现

    引言 夜间模式其实属于多主题切换的一种,不过是最麻烦的一种.因为在夜间模式下不仅要切换主色调,次要色调等等,还要覆盖一些特殊的颜色,因为在夜间模式下总不能什么都是黑的把,那不得丑死-.-,所以当你夜间 ...

  3. Android实现夜间模式

    如今非常多App都有夜间模式,特别是阅读类的App.夜间模式如今已经是阅读类App的标配了,其实,日间模式与夜间模式就是给App定义并应用两套不同颜色的主题,用户能够自己主动或者手动的开启,今天用An ...

  4. Android实现夜间模式小结

    随着APP实现的功能越来越丰富, 看小说看视频上网等等, 如今不少人花在手机平板等移动终端上的时间越来越长了. 但手机和平板的屏幕并不像Kindle那类电纸书的水墨屏那么耐看, 因为自发光的屏幕特性, ...

  5. Android记录24-WebView实现白天/夜间阅读模式

    前言 本篇博客给大家分享一个WebView的使用案例.实现Android调用JavaScript代码来控制白天/夜间模式. 关于WebView怎样使用,官网有非常好的说明,Building Web A ...

  6. Android 夜间模式的实现

    package com.loaderman.daynightdemo; import android.os.Bundle; import android.support.v7.app.AppCompa ...

  7. Android 高级UI设计笔记24:Android 夜间模式之 WebView 实现白天 / 夜间阅读模式 (使用JavaScript)

    1. 问题引入: 前面我们是使用方法 降低屏幕亮度(不常用) 和 替换theme,两者都是针对Activity的背景进行白天.夜间模式的交换,但是如果我们显示的是Html的内容,这个时候改怎么办? 分 ...

  8. Android 利用an框架快速实现夜间模式的两种套路

    作者:Bgwan链接:https://zhuanlan.zhihu.com/p/22520818来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 网上看到过大多实现夜间模 ...

  9. android夜间模式实现

    一.概述 android夜间模式实现分为两大类 重启activity的实现 不重启activity的实现 二.正文 1.重启activity实现夜间模式[在界面文件中的实现部分] 1.1在attrs. ...

随机推荐

  1. 查看Linux软件信息

    查看系统发型版本 1. 对于linux系统而已,有成百上千个发行版.对于发行版的版本号查看方法 如以centos为例.输入lsb_release -a即可 该命令适用于所有的linux,包括Redha ...

  2. 语句--分支语句if case

    语句是指程序命令,都是按照顺序执行的.语句在程序中的执行顺序称为“控制流”或者“执行流”.根据程序对运行时所收到的输入的响应,在程序每次运行时控制流可能有所不同. 语句可以嵌套,可以是以分号结尾的单行 ...

  3. Android中 在显示ImageView时图片上面和下面都出现一段空白区间的解决办法

    开始的时候是在ScrollView中显示ImageView的时候出现这样的问题,以为是要对ScrollView进行设置的,后来发现单独显示一个ImageView的时候也会出现这样的问题,由此才知道是应 ...

  4. python与字符集编码

    讲的比较明白的博客:http://www.cnblogs.com/huxi/archive/2010/12/05/1897271.html 以上面博文的汉为例子,汉字的GBK编码是baba, UNIC ...

  5. 特征值提取之 -- TF-IDF值的简单介绍

    首先引用百度百科的话: "TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度.字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料 ...

  6. 两段超简单jquery代码解决iframe自适应高度问题(不用判断浏览器高度)

    这里介绍两个超级简单的方法,不用写什么判断浏览器高度.宽度啥的.下面的两种方法自选其一就行了.一个是放在和iframe同页面的,一个是放在test.html页面的.注意别放错了地方.iframe的代码 ...

  7. JavaWeb chapter 1 http协议

    1.  静态web和动态web的区别: 静态web和动态web最本质的区别是静态web是无法进行数据库操作,而动态web是可以进行数据库操作的.动态web的最大特点就是具有交互性,所谓交互性就是服务器 ...

  8. Matrix-Tree定理

    感觉又学到了一个利器! 感谢Vfleaking神犇,传送门 http://vfleaking.blog.163.com/blog/static/1748076342013112523651955/   ...

  9. 枚举IoTimer

    /*************************************************************************************** * AUTHOR : ...

  10. python错误集锦

    1.lt与list等同,不能作为变量名 2.中文路径名:os.path.normcase(filepath) 如果遇到 ascii码在路径某处不能转换, 那么 filepath.encode('gbk ...