前言
Android 6.0以后系统提供了AppCompatDelegate用来实现夜间模式和日间模式的切换,AppCompatDelegate中存在以下几种模式:

AppCompatDelegate.MODE_NIGHT_YES:设置夜间模式

AppCompatDelegate.MODE_NIGHT_NO:设置日间模式

AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM:跟随系统设置决定是否设置夜间模式

AppCompatDelegate.MODE_NIGHT_AUTO:根据当前时间自动切换模式

实现夜间模式需要配置两套资源文件而且资源文件的命名要完全一致,后缀带-night的目录对应夜间模式,比如values对应日间模式,values-night对应夜间模式,系统会根据当前的模式自动加载对应的资源文件。

日间模式     夜间模式
values     values-night
drawable     drawable-night
drawable-xhdpi     drawable-night-xhdpi
mipmap-mdpi     mipmap-night-mdpi
mipmap-hdpi     mipmap-night-hdpi
mipmap-xhdpi     mipmap-night-xhdpi
mipmap-xxhdpi     mipmap-night-xxhdpi
mipmap-xxxhdpi     mipmap-night-xxxhdpi

设置主题
首先设置应用主题为DayNight模式,如Theme.AppCompat.DayNight.DarkActionBar或者Theme.MaterialComponents.DayNight.DarkActionBar,如下:

<style name="Theme.NightModeDemo" parent="Theme.MaterialComponents.DayNight.DarkActionBar"><!-- Primary brand color. --><item name="colorPrimary">@color/purple_500</item><item name="colorPrimaryVariant">@color/purple_700</item><item name="colorOnPrimary">@color/white</item><!-- Secondary brand color. --><item name="colorSecondary">@color/teal_200</item><item name="colorSecondaryVariant">@color/teal_700</item><item name="colorOnSecondary">@color/black</item><!-- Status bar color. --><item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item><!-- Customize your theme here. -->
</style>

AndroidManifest配置application的android:theme:

<applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.NightModeDemo"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity>
</application>

顺便说一下,现在在Android Studio 4.0以上新建的project已经默认主题样式为Theme.MaterialComponents.DayNight.DarkActionBar,同时已经配置了日间和夜间两套主题文件theme.xml。

配置颜色
src/main/res目录下新建values-night目录,在该目录下新建colors.xml,然后配置同一个颜色值在values/colors.xml和values-night/colors.xml、也就是日间模式和夜间模式下对应的取值,注意颜色值的命名要完全一样。

values/colors.xml取值如下:

<resources><color name="black">#000000</color><color name="white">#FFFFFF</color><color name="window_background">#FFFFFF</color>
</resources>

values-night/colors.xml取值如下:

<resources><color name="black">#FFFFFF</color><color name="white">#000000</color><color name="window_background">#000000</color>
</resources>

配置图片
src/main/res目录下新建mipmap-night-xhdpi目录,在mipmap-night-xhdpi和mipmap-xhdpi目录分别配置夜间和日间模式的两套图片,注意两张图片的命名要完全一样。以ic_pic为例,项目结构如下:

使用

在布局文件中使用配置好的颜色和图片:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/window_background"android:gravity="center"android:orientation="vertical"tools:context=".MainActivity"><TextViewandroid:id="@+id/modeTv"android:layout_width="100dp"android:layout_height="50dp"android:background="@drawable/shape_btn_bg"android:gravity="center"android:textColor="@color/black"android:textSize="15sp"tools:text="白天模式" /><ImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="50dp"android:src="@mipmap/ic_pic" /></LinearLayout>

其中shape_btn_bg如下:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"><corners android:radius="6dp" /><strokeandroid:width="2dp"android:color="@color/black" /><solid android:color="@color/white" />
</shape>

在代码中使用:

class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)initMode()modeTv.setOnClickListener {switchMode()}}private fun initMode() {when (AppCompatDelegate.getDefaultNightMode()) {AppCompatDelegate.MODE_NIGHT_NO -> {modeTv.text = "日间模式"}AppCompatDelegate.MODE_NIGHT_YES -> {modeTv.text = "夜间模式"}else -> {modeTv.text = "日间模式"}}}//切换夜间模式private fun switchMode() {when (AppCompatDelegate.getDefaultNightMode()) {AppCompatDelegate.MODE_NIGHT_NO -> {  //当前为日间模式AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)  //切换为夜间模式}AppCompatDelegate.MODE_NIGHT_YES -> {  //当前为夜间模式AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)  //切换为日间间模式}else -> {AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)  //切换为夜间模式}}recreate()  //需要调用该方法才能生效}}

最后看一下效果:

源码地址 
————————————————
版权声明:本文为CSDN博主「xuzhb24」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xuzhb_blog/article/details/121415362

夜间模式(黑夜模式)的简单实现相关推荐

  1. 设置firefox背景为黑夜模式

    本来我觉得浏览器的黑夜模式应该很容易的就设置了啊,结果没想到啊! 早先我在手机上设置移动版的firefox黑夜模式的时候,倒是挺简单的,直接到附加组件里面搜索blcak background and ...

  2. 关于如何在Windows中让电脑如Mac般变为黑夜模式(想让Chrome变成黑夜模式也行得通)

    关于如何在Windows中让电脑如Mac般变为黑夜模式(想让Chrome变成黑夜模式也行得通) 简单异常.右击,选择个性化,点击颜色,下拉,找到"选择默认应用模式",点击" ...

  3. Java设计模式-工厂模式(1)简单工厂模式

    Java设计模式-工厂模式(1)简单工厂模式 一.前言 1)例子 2)类图关系 3)代码实现 二.简单工厂模式 2.1.概述: 2.2.类图关系: 2.3.代码修改: 2.4.优缺点 2.5.扩展-简 ...

  4. java的简单工厂模式_java设计模式之简单工厂模式

    简单工厂模式的概念 就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建.简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例. ...

  5. Win11黑夜模式在哪开启 Win11黑夜模式怎么开启

    为了保护我们的眼睛长期面对电脑用眼过度或用眼疲劳,出现干眼症.视力下降等等问题,Win10系统推出了保护视力的黑暗模式,降低长期用眼的伤害.但是现在用户升级了Win11系统却找不到黑暗模式在哪里了,下 ...

  6. C++设计模式-使用Qt框架模拟策略模式(Strategy)+简单工厂实现商场促销

    商城促销: 1.简单工厂模式:客户端认识两个类,CashSuper与CashFactory 2.简单工厂模式 + 策略模式:客户端只要认识CashContext就可以了,更加降低耦合性 策略模式解析: ...

  7. KXD黑夜模式流星滑落个人主页HTML源码

    介绍: KXD黑夜流星个主页黑夜模式流星滑落个人主页HTML网页源码分享 白天/黑夜 都添加了背景 没有那么单调了,优化了流星样式,优化了文字布局 网盘下载地址: http://kekewl.cc/4 ...

  8. android常用的工厂模式,Android的设计模式-简单工厂模式

    前言 Android的设计模式系列文章介绍,欢迎关注,持续更新中:java 1.定义 定义一个用于建立对象的接口,让子类决定实例化哪一个类.设计模式 2.介绍 简单工厂模式属于建立型模式. 简单工厂模 ...

  9. PhalAPI学习笔记拓展篇 ———ADM模式中NotORM实现简单CURD

    PhalAPI学习笔记拓展篇 ---ADM模式中NotORM实现简单CURD 前言 内容 ADM模式 ADM简单介绍 准备工作 PhalAPI提供的CURD操作方法 业务实现 结束语 前言 公司业务需 ...

最新文章

  1. 数据团队「隐形守护者」!从被动应对到资源输出,腾讯安全20年成长记
  2. Python代码编写中的性能优化点
  3. 02_python是一种什么语言?
  4. Java内存原型分析:基本知识
  5. inception mysql 审核_mysql 审核引擎 goInception 的基本使用
  6. Confluence 6 配置服务器基础地址示例
  7. Docker最全教程之Go实战,墙裂推荐(十九)
  8. 我的学习生涯(Delphi篇) - 21
  9. scala类型匹配注意事项
  10. [转帖]buffer与cache的区别
  11. php中级联,php级联
  12. IDEA如何安装使用阿里代码规范插件
  13. 今日头条 ANR 优化实践系列 - Barrier 导致主线程假死
  14. 【程序人生】底层程序员,出局
  15. qq邮箱不能上传文件的修复
  16. CSR867x — 如何修改BLE的蓝牙地址
  17. C++与lua的结合,LuaBridge的使用及遇到的坑
  18. matlab图像导数求积分_matlab微积分问题:导数、偏导数
  19. python 使用for循环,遍历列表里想要的值
  20. matlab获取图像某点RGB值、灰度值的方法

热门文章

  1. 初始化创建 list
  2. Dubbo 负载均衡(4种策略算法)
  3. dubbo负载均衡策略解析
  4. Win10 x64 1903 搭建双机调试
  5. java数组元素旋转,Java实现右旋转数组元素
  6. XYNUOJ 1255: 寻找最大数 酒馆浪人的博客
  7. java 逻辑运算符的概念和使用
  8. WinRAR自解压安装并开机自启
  9. html怎么在链接中加链接,怎么给div加链接 在div中可以加整体的链接
  10. <CSS练习> 综合案例-学成网 含素材 静态网页