如今非常多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实现夜间模式的更多相关文章

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

     Android白天/夜间模式Day/Night Mode标准原生SDK实现 章节A:Android实现白天/夜间模式主要控制器在于UiModeManager,UiModeManager是Andr ...

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

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

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

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

  4. Android实现夜间模式小结

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

  5. Android 夜间模式的实现

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

  6. android夜间模式实现

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

  7. android简单的夜间模式

    现在android项目values下打 attrs.xml <?xml version="1.0" encoding="utf-8"?> <r ...

  8. Android 夜间模式changeskin小结

    @author vivian8725118 @CSDN http://blog.csdn.net/vivian8725118 @简书 http://www.jianshu.com/p/832e9776 ...

  9. Android夜间模式的几种实现

    一.直接修改widget颜色,这种方式实现起来最简单,但需要每个控件都去修改,太过复杂.例如: /** * 相应交互,修改控件颜色 * @param view */public void onMeth ...

随机推荐

  1. ES6语法(一)let 和 const 命令

    1.let命令 与 var 的区别 用法类似于var,但是所声明的变量,只在 let命令所在的代码块内有效. var 声明的变量可以在声明之前使用,值为 undefined ;let命令改变了语法行为 ...

  2. jQuery插件备忘

    jQuery BlockUI Plugin  遮罩插件                                                                          ...

  3. Go语言排序算法实现

    // Algorithm project Algorithm.go package Algorithm // 冒泡排序 func BubbleSort(a []int) { n := len(a) ; ...

  4. Error-MVC: 未能找到路径“D:\\DsWeb\DS.Web\dist\bin\roslyn\csc.exe”的一部分。

    ylbtech-Error-MVC: 未能找到路径“D:\\DsWeb\DS.Web\dist\bin\roslyn\csc.exe”的一部分. 1.返回顶部 1, “/”应用程序中的服务器错误. 未 ...

  5. SpringDataJpa学习

    # SpringBoot Jdbc JPA JPA是`Java Persistence API`的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的 ...

  6. fopen_s遇到的一个问题

    今天使用公司代码的日志模块记录程序运行的相关信息,发现日志总是只有两条记录,即程序启动和结束,别的都没有.跟踪了很久,终于发现是日志输出模块被我修改了一个地方:把fopen改成了fopen_s,毕竟报 ...

  7. Could not parse multipart servlet request; nested exception is org.apache.commons.fileupload.FileUploadBase$IOFileUploadException: Processing of multipart/form-data request failed.

    org.springframework.web.multipart.MultipartException: Could not parse multipart servlet request; nes ...

  8. oralce 11.2.0.4手动创建EM

    安装完oracle,启动dbconsole,失败 [oracle@elearning admin]$ emctl start dbconsole OC4J Configuration issue. / ...

  9. 【PMP】关键路径法与关键链法

    通俗理解 关键路径法:把项目上的资源都事先全部分到每个活动上. 关键链法:每个活动不打富余,项目经理自己掌握资源,哪个成员执行过程中遇到困难,再给他单独分配资源. PMBOK定义 关键路径法:关键路径 ...

  10. python - Linux C调用Python 函数

    1.Python脚本,名称为py_add.py def add(a=,b=): print('Function of python called!') print('a = ',a) print('b ...