Android实现夜间模式
如今非常多App都有夜间模式,特别是阅读类的App。夜间模式如今已经是阅读类App的标配了,其实,日间模式与夜间模式就是给App定义并应用两套不同颜色的主题,用户能够自己主动或者手动的开启,今天用Android自带的support包来实现夜间模式。
因为Support Library在23.2.0的版本号中才加入了Theme.AppCompat.DayNight主题,所以依赖的版本号必须是高于23.2.0的。而且,这个特性支持的最低SDK版本号为14,所以。须要兼容Android 4.0的设备,是不能使用这个特性的。在API Level 14下面的设备会默认使用亮色主题。
只是如今4.0下面的设备应该比較少了吧,毕竟微信的minSdkVersion都设置为14了。
加入依赖

准备资源
让应用继承DayNight主题
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.DayNight.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
</resources>
新建夜间模式资源目录:
在res目录下新建values-night目录,然后在此目录下新建colors.xml文件在夜间模式下的应用的资源。当然也能够依据须要新建drawable-night,layout-night等后缀为-night的夜间资源目录。例如以下:

内容例如以下:
values/colors.xml
<? xml version="1.0" encoding="utf-8"? >
<!-- day values colors.xml -->
<resources>
<color name="colorPrimary">#009688</color>
<color name="colorPrimaryDark">#00796B</color>
<color name="colorAccent">#009688</color>
<color name="textColorPrimary">#616161</color>
<color name="viewBackground">@android:color/white</color>
<color name="colorDayNightChange">@android:color/holo_orange_dark</color>
</resources>
values/strings.xml
<resources>
<string name="app_name">DayNight</string>
<string name="day_night_label">日间模式</string>
</resources>
values-night/colors.xml
<? xml version="1.0" encoding="utf-8"?>
<!-- night values colors.xml -->
<resources>
<color name="colorPrimary">#35464e</color>
<color name="colorPrimaryDark">#212a2f</color>
<color name="colorAccent">#212a2f</color>
<color name="textColorPrimary">#616161</color>
<color name="viewBackground">#212a2f</color>
<color name="colorDayNightChange">@android:color/holo_blue_dark</color>
</resources>
values-night/strings.xml
<resources>
<string name="app_name">DayNight</string>
<string name="day_night_label">夜间模式</string>
</resources>
使Activity继承自AppCompatActivity

在Application中设置初始主题

动态切换

代码逻辑实现例如以下:
acitivity_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:layout_marginLeft="10dp"
android:layout_marginRight="10dp"> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="@string/day_night_label"
android:textSize="20sp"
android:textColor="@color/colorDayNightChange" /> <Button
android:id="@+id/day_night_change"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginLeft="5dp"
android:text="日夜间模式切换"
android:textSize="20sp"
android:textColor="@color/colorDayNightChange"/>
</LinearLayout>
MainActivity.java
package com.jackie.daynight; import android.content.res.Configuration;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.app.AppCompatDelegate;
import android.view.View;
import android.widget.Button; public class MainActivity extends AppCompatActivity {
private Button mDayNightChange; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); mDayNightChange = (Button) findViewById(R.id.day_night_change); mDayNightChange.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int mode = getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
if (mode == Configuration.UI_MODE_NIGHT_YES) {
getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_NO);
} else if (mode == Configuration.UI_MODE_NIGHT_NO) {
getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_YES);
} recreate();
}
});
}
}
MyApplication.java
package com.jackie.daynight; import android.app.Application;
import android.support.v7.app.AppCompatDelegate; /**
* Created by Jackie on 2017/3/6.
* Application
*/ public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate(); /**
* 默认设置一直使用夜间模式
*
* 这里AppCompatDelegate.setDefaultNightMode()方法能够接受的參数值有4个:
* MODE_NIGHT_NO. Always use the day (light) theme(一直应用日间(light)主题).
* MODE_NIGHT_YES. Always use the night (dark) theme(一直使用夜间(dark)主题).
* MODE_NIGHT_AUTO. Changes between day/night based on the time of day(依据当前时间在day/night主题间切换).
* MODE_NIGHT_FOLLOW_SYSTEM(默认选项). This setting follows the system’s setting, which is essentially MODE_NIGHT_NO(尾随系统,通常为MODE_NIGHT_NO).
*/
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
}
}
效果例如以下:
Android实现夜间模式的更多相关文章
- Android白天/夜间模式Day/Night Mode标准原生SDK实现
Android白天/夜间模式Day/Night Mode标准原生SDK实现 章节A:Android实现白天/夜间模式主要控制器在于UiModeManager,UiModeManager是Andr ...
- Android 之夜间模式(多主题)的实现
引言 夜间模式其实属于多主题切换的一种,不过是最麻烦的一种.因为在夜间模式下不仅要切换主色调,次要色调等等,还要覆盖一些特殊的颜色,因为在夜间模式下总不能什么都是黑的把,那不得丑死-.-,所以当你夜间 ...
- 【android】夜间模式简单实现
完整代码,请参考我的博客园客户端,git地址:http://git.oschina.net/yso/CNBlogs 关于阅读类的app,有个夜间模式真是太重要了. 那么有两种方式可以实现夜间模式 1: ...
- Android实现夜间模式小结
随着APP实现的功能越来越丰富, 看小说看视频上网等等, 如今不少人花在手机平板等移动终端上的时间越来越长了. 但手机和平板的屏幕并不像Kindle那类电纸书的水墨屏那么耐看, 因为自发光的屏幕特性, ...
- Android 夜间模式的实现
package com.loaderman.daynightdemo; import android.os.Bundle; import android.support.v7.app.AppCompa ...
- android夜间模式实现
一.概述 android夜间模式实现分为两大类 重启activity的实现 不重启activity的实现 二.正文 1.重启activity实现夜间模式[在界面文件中的实现部分] 1.1在attrs. ...
- android简单的夜间模式
现在android项目values下打 attrs.xml <?xml version="1.0" encoding="utf-8"?> <r ...
- Android 夜间模式changeskin小结
@author vivian8725118 @CSDN http://blog.csdn.net/vivian8725118 @简书 http://www.jianshu.com/p/832e9776 ...
- Android夜间模式的几种实现
一.直接修改widget颜色,这种方式实现起来最简单,但需要每个控件都去修改,太过复杂.例如: /** * 相应交互,修改控件颜色 * @param view */public void onMeth ...
随机推荐
- Centos服务器端口无法访问
使用GPRS A6 模块进行TCP连接的时候,一度认为A6模块坏掉了 最终只是服务器端口都被防火墙堵住了 使用之前一直用的 service iptables stop 找不到iptables 原来 ...
- 【数论&想法题】小C的问题 @"科林明伦杯"哈尔滨理工大学第八届程序设计竞赛
Time Limit: 1000 MS Memory Limit: 256000 K Description 小C是一个可爱的女孩,她特别喜欢世界上最稳定的图形:三角形.有一天她得到了n根木棍,她把这 ...
- JAVA自学笔记24
JAVA自学笔记24 1.能使用同步代码块就使用同步代码块,除非锁对象是this,就可以考虑使用同步方法.静态方法的锁是类的字节码对象. 2.JDK5新特性 1)接口Lock void Lock()/ ...
- Visual Studio 2015编译Lua 5.3.4遇到的坑
被坑的不浅,遇到错误:" LNK1561:必须定义入口点",解决方案删除再建,步骤一遍一遍操作,还是报错.如下图所示: 首先,它必须要改成DLL或者LIB(动态/静态库),如果是应 ...
- Python 和 Scikit-Learn
Reference:http://mp.weixin.qq.com/s?src=3×tamp=1474985436&ver=1&signature=at24GKibw ...
- UVA - 1456 Cellular Network
题目大意: 手机在蜂窝网络中的定位是一个基本问题.如果蜂窝网络已经得知手机处于c1, c2,-,cn这些区域中的一个.最简单的方法是同一时候在这些区域中寻找手机.但这样做非常浪费带宽. 因为蜂窝网络中 ...
- DockerSwarm+Dubbo镜像与部署相关命令与参数
Docker 镜像 一.容器转镜像 docker commit <containerId> <image:tag> docker commit 3ffa4284ddca zoo ...
- 第三天:MDN CSS学习笔记
一:CSS基础 1:DOM 当浏览器显示文档时,它必须将文档的内容与其样式信息结合.它分两个阶段处理文档: 浏览器将 HTML 和 CSS 转化成 DOM (文档对象模型).DOM在计算机内存中表示文 ...
- go微服务框架go-micro深度学习-目录
go微服务框架go-micro深度学习(一) 整体架构介绍 go微服务框架go-micro深度学习(二) 入门例子 go微服务框架go-micro深度学习(三) Registry服务的注册和发现 go ...
- c# 非调试状态下面执行
#if !DEBUG View("ErrorSimple").ExecuteResult(ControllerContext);#endif