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 ...
随机推荐
- Java 构造器 考虑用静态构造方法代替构造器
类可以提供一个公有的静态工厂方法,它是一个返回类的实例的静态方法.静态工厂方法与设计模式中的工厂方法模式不同. 优势: 静态工厂方法与构造器不同的第一大优势在于,它们有名称.一个类只能有一个带有指定签 ...
- EasyAR 开发实例---AR礼物(简单demo)
一个节日礼物效果 --显示模型 在本次的案例中,我使用的是unity5.6.3版本,EasyAR 为2.0.(用1.0的版本,在渲染那块有问题) [导入SDK]到EasyAR官网(http://www ...
- c# 后台绑定treeview 多个tab
<wijmo:C1Tabs ID="C1Tab1" runat="server" ><%--OnSelectedChanged="& ...
- List集合的总结和应用场景的介绍
1.List的整体介绍 List 是一个接口,它继承于Collection的接口,它代表着有序的队列.list的实现类对象中每一个元素都有一个索引值,能够按照索引值进行元素查找. AbstractLi ...
- weblogic 内存配置
修改weblogic 使用内存 修改位置:startWeblogic.sh 在最开头增加使用内存配置信息如下: 我的服务器配置 内存:32G ,CPU:16 根据实际情况配置 #!/bin/sh ...
- spring中的多线程aop方法拦截
日常开发中,常用spring的aop机制来拦截方法,记点日志.执行结果.方法执行时间啥的,很是方便,比如下面这样:(以spring-boot项目为例) 一.先定义一个Aspect import org ...
- bat获取文件夹里面所有文件夹的名称方法
创建一个123.txt文档,修改名称为123.bat 里面填写内容如下: DIR *.* /B >文件名清单.TXT 保存,双击执行即可获取生成文件夹名称的txt文档
- tmux终端工具的简单使用
Linux上管理和运行进程除了程序级别的守护进程之外,经常用到的有比如nohup &的方式,以及screen会话的方式,而Tmux正是一个非常优秀的终端进程管理的软件,和GNU screen类 ...
- Android_Printservice_API_部分翻译
文件夹 * package android.printservice * public abstract class PrintService * public abstract class Prin ...
- 科技论文之Latex公式&符号
近期在写文章.有好多数学公式的命令都忘记了. 今天索性一起整理下. 1 能够在文章的作者上引用的符号 2 一些括号使用方法 3 一些高等数学的公式 4 交,并集 5 一些二项式 6 矩阵写法 7 ...