Android 深色模式适配总结

前言

iOS13退出暗黑模式,既然苹果实现了暗黑模式,那么安卓肯定不能落下啊,所以在安卓10(Q API级别29)中支持了暗黑模式,不过官方的叫法为Dark theme。

适配流程

主题设置

为了支持Dark主题,必须将应用的主题设置为继承自DayNight系列的主题。

Theme.MaterialComponents.DayNight.DarkActionBar
或:
Theme.AppCompat.DayNight

资源文件处理

需要在对应的资源文件中添加night文件夹,这里存放的就是深色模式相关的资源,也就是说需要准备2套资源。

如:

代码相关

XML布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/color_background"android:gravity="center_horizontal"android:orientation="vertical"tools:context=".MainActivity"><ImageViewandroid:id="@+id/imageView"android:layout_width="200dp"android:layout_height="100dp"android:layout_marginTop="10dp"android:scaleType="fitXY"android:src="@drawable/light" /><ImageViewandroid:layout_width="50dp"android:layout_height="50dp"android:layout_marginTop="10dp"android:background="@drawable/frame_shape"android:src="@drawable/ic_daynight"app:tint="@color/color_daynight" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:text="@string/day_night"android:textColor="@color/color_daynight"android:textSize="18sp" /><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:orientation="horizontal"><Buttonandroid:id="@+id/btnLight"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="浅色模式" /><Buttonandroid:id="@+id/btnDark"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginHorizontal="10dp"android:text="深色模式" /><Buttonandroid:id="@+id/btnSystem"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="跟随系统" /></LinearLayout>
</LinearLayout>

代码:

object ThemeUtils {/*** 是否深色主题*/fun isDarkTheme(context: Context): Boolean {val flag = context.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASKreturn flag == Configuration.UI_MODE_NIGHT_YES}
}
class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)Log.e("TAG", "Activity onCreate()")initView()}private fun initView() {btnLight.setOnClickListener {AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)}btnDark.setOnClickListener {AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)}btnSystem.setOnClickListener {AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)}}override fun onStart() {super.onStart()if (ThemeUtils.isDarkTheme(this)) {imageView.setImageResource(R.drawable.dark)} else {imageView.setImageResource(R.drawable.light)}}override fun onDestroy() {super.onDestroy()Log.e("TAG", "Activity onDestroy()")}
}

效果:

配置变更问题

当切换深色模式时,Activity就会重新加载,重走生命周期流程。

为了避免界面重新加载,可以在AndroidManifest.xml文件中设置Activity的android:configChanges="uiMode"。当配置发生变化时,可以通过onConfigurationChanged()`监听当前应用是什么模式。

//监听系统深色模式切换
override fun onConfigurationChanged(newConfig: Configuration) {Log.e("TAG", "onConfigurationChanged:")super.onConfigurationChanged(newConfig)val currentNightMode = newConfig.uiMode and Configuration.UI_MODE_NIGHT_MASKwhen (currentNightMode) {Configuration.UI_MODE_NIGHT_NO -> {// 夜间模式未启用,我们正在使用浅色主题textView.setText("当前浅色模式")}Configuration.UI_MODE_NIGHT_YES -> {// 夜间模式启用,我们使用的是深色主题textView.setText("当前深色模式")}}
}

代码下载

Android 深色模式适配总结相关推荐

  1. android自动切换暗色,超实用!Android 深色模式适配(可定时开启的APP内主题切换管理工具)...

    前言 前面分享了一篇"黑白化主题"的文,主要适用场景是不久就要到来的"清明"等时节或者是其他的国家公祭日什么的(一名成熟的程序员,要学会自己提产品需求). 今天 ...

  2. Android深色模式适配原理分析,android应用开发

    return when (resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK) { Configuration.UI ...

  3. Android 暗黑模式适配

    Android 暗黑模式适配 不爱废话直接上菜. 第一种适配方式: 1.1 直接修改APP主题,values/styles.xml 如下: <style name="AppTheme& ...

  4. H5页面系统深色模式适配

    1. 在css中设置CSS 媒体查询 PC web模式适配,在css中通过media查询进行适配即可生效. /*日间模式*/ @media (prefers-color-scheme: light) ...

  5. Web前端深色模式适配方案

    众所周知,GitHub 网站在前不久支持了深色模式.我在看 GitHub 的时候发现浏览器默认的滚动条也变成了深色样式: 我当时猜测应该有一个属性可以声明配色方案,然后浏览器根据声明的配色方案采用相应 ...

  6. Android深色模式下,看不见字的解决办法

    你去看看,看不见字的那些是不是都没有设置字体颜色! 设置一下字体颜色就好啦! 对于AlertDialog,千万不要用它自己的,要我们自己写好view,然后设置view,不然的话,深色模式下,你是很难修 ...

  7. Android暗黑模式适配

    前言 最近这两年,用户关于支持暗黑模式的呼声越来越高.而友商也基本都上了暗黑模式,于是老板也要求我们年前得上,可是工作量太大了,200多个页面,一个人整,实在是没法年前发,就拖到了年后上. 成果 1. ...

  8. 实现页面适配_微信公众号文章页面适配深色模式

    最近安卓微信7.0.10正式版发布,更新过后,很多用户发现,之前在测试版中对系统深色模式的适配功能被取消了,小伙伴们对此很是不满,好在Android 10系统手机用户占比很少,影响范围还不是很大,并且 ...

  9. iOS13适配深色模式(Dark Mode)

    原文博客地址: iOS13适配深色模式(Dark Mode) 好像大概也许是一年前, Mac OS系统发布了深色模式外观, 看着挺刺激, 时至今日用着也还挺爽的 终于, 随着iPhone11等新手机的 ...

  10. iOS13适配深色模式(Dark Mode)总结

    iOS13适配深色模式(Dark Mode)总结 好像大概也许是一年前, Mac OS系统发布了深色模式外观, 看着挺刺激, 时至今日用着也还挺爽的 终于,随着iPhone11等新手机的发售, iOS ...

最新文章

  1. Linux 设备驱动--- 阻塞型字符设备驱动 --- O_NONBLOCK --- 非阻塞标志【转】
  2. 信息系统项目管理师_信息系统项目管理师历史文章总结
  3. 【动态规划】最小代价问题
  4. Intel Haswell/Broadwell架构/微架构/流水线 (2)-流水线前端
  5. SQL中in参数在存储过程中传递及使用的方法
  6. 【数据库原理实验(openGauss)】创建数据库、表和索引
  7. iOS开发:报错The sandbox is not in sync with the Podfile.lock. Run ‘pod install‘ …的解决方法
  8. 计算机硬件常见的故障及维修方法,计算机硬件常见故障及解决方法
  9. 安卓一些错误经验积累
  10. python统计学课程_Python数据分析(统计分析)视频课程
  11. linux启用NAT功能,双网卡共享网络,iptables简单实现
  12. 【CXY】JAVA基础 之 JDBC
  13. CallStranger UPnP 漏洞曝光,影响数十亿台设备
  14. mysql的表面sno大全_学生表学号sno数据库
  15. 路由器可以当交换机用吗
  16. Android通用框架设计与完整电商APP开发系列文章
  17. 哈尔滨师范大学计算机科学与信息工程学院,计算机科学与信息工程学院邀殷明浩教授举办学术讲座...
  18. element-ui中el-cascader级联选择器多选判断是否是全选
  19. mysql查询逗号隔开的字段
  20. 汽车电子EMC电磁兼容测试标准 汽车电子电磁兼容检测项目

热门文章

  1. 无穷项和求极限(定积分)
  2. ps抠图怎么放大图片_ps中在使用抠图工具时如何用快捷键移动放大的原始图片?...
  3. 关于CSS居中显示的总结
  4. Ubuntu 16.04.5 (x86_64)下安装CUDA10 for 深度学习
  5. 红包裂变被动吸粉引流方法,如何通过红包裂变的方式吸粉
  6. java long转float_Java中为什么long能自动转换成float类型
  7. No HttpMessageConverter for com.ysd.entity.Users
  8. 求素数平均值c语言,C 输入10个正整数到a数组中,求a数组中素数的平均值.
  9. 免费书签管理工具:浏览器书签杂乱的整理方法
  10. 为什么计算机编程以英语为主,为什么英语对于编程来说非常重要