Android深色主题适配

序言

之前我有讲过Android换肤功能的实现,具体看juejin.cn/post/725848... 。本篇就来讲讲另外一个类似功能,深色模式适配。从Android10以来,官方直接在系统层面支持了深色模式的功能。

适配深色主题的好处

  1. 为弱视以及对强光敏感的用户提高可视性
  2. 省电,OLED屏幕跟电阻屏LCD屏幕不一样,如果是黑色,则可以不发光,减少电池的损耗
  3. 更换UI风格,降低审美疲劳
  4. 专业,逼格更高,这可能是某些开发者的主要原因,哈哈

开始适配

主要适配的流程有以下两点:

  1. 添加-night的资源,如res/values-night/colors.xml,适配文字和背景底色
  2. 应用内提供切换为深色模式、浅色模式以及跟随系统的界面

自动适配

Android10提供Force Dark功能,通过给themes.xml或styles.xml的style节点下添加item节点。大项目可以先用自动适配,然后慢慢进行手动适配。

xml 复制代码
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:forceDarkAllowed" tools:targetApi="Q">true</item>
</style>

手动适配

对自动适配的颜色不满意的地方,可以采用手动适配。那就要自行提供-night的资源了。主题和样式覆盖的优先级可以参考我的这篇文章juejin.cn/post/719151... ,所以它能覆盖掉系统定义的。

切换深/浅色模式

最终调用AppCompatDelegate.setDefaultNightMode切换深/浅色模式,切换过程建议在启动页完成,因为这个系统的切换API有一定的延迟。

kotlin 复制代码
    // 始终以软件保存的暗色模式为准
    if (SPUtils.readBoolean(this, Environment.PREF_DAY_NIGHT_MODE)) {
        AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
    } else {
        AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
    }
    startActivity(Intent(this@SplashActivity, MainActivity::class.java))
    // 淡入淡出效果
    overridePendingTransition(R.anim.fade_in, R.anim.fade_out)
    finish()

其他注意事项

当我们调用AppCompatDelegate.setDefaultNightMode()方法的时候,系统会自动重新重建Activity,如果你不想要重新创建,则可在AndroidManifest.xml的activity节点中指定 android:configChanges="uiMode",然后重写onConfigurationChanged()方法,自己处理切换逻辑。

kotlin 复制代码
override fun onConfigurationChanged(newConfig: Configuration) {
    super.onConfigurationChanged(newConfig)
    val nightMode = newConfig.uiMode and Configuration.UI_MODE_NIGHT_MASK
    if (nightMode == Configuration.UI_MODE_NIGHT_YES) {
        // 切换为深色模式,在这里写你的逻辑...
    }
    if (nightMode == Configuration.UI_MODE_NIGHT_NO) {
        // 切换为浅色模式,在这里写你的逻辑...
    }
}

总结

深色主题的适配其实并不复杂,主要注意在启动页调用AppCompatDelegate.setDefaultNightMode()方法来加载预设主题配置。适配流程不清晰的回头看前面的内容,其实主要也就是添加暗色资源,然后调用系统的切换方法。另外多语言的适配也是一个提升App质量的一个方面,juejin.cn/post/733879...

相关推荐
娅娅梨4 小时前
Android- Surface, SurfaceView, TextureView, SurfaceTexture 原理图解
android·surface
2501_915918415 小时前
HTTPS 端口号详解 443 端口作用、iOS 抓包方法、常见 HTTPS 抓包工具与网络调试实践
android·网络·ios·小程序·https·uni-app·iphone
程序员码歌5 小时前
明年35岁了,如何破局?说说心里话
android·前端·后端
UWA6 小时前
Gears实测室:第一期·音游跨设备性能表现与工具价值实践
信息可视化·性能优化·游戏开发·uwa
非门由也7 小时前
Android studio安装教程——超详细(含安装包安装教程)
android·ide·android studio
平淡风云7 小时前
Android应用添加日历提醒功能
android·日历
鼠鼠我捏,要死了捏8 小时前
大规模系统中的分库分表原理深度解析与性能优化实践指南
数据库·性能优化·分库分表
骐骥18 小时前
2025-09-08升级问题记录:app提示“此应用专为旧版Android打造..”或“此应用与最新版 Android 不兼容”
android·升级·不兼容·target sdk·专为旧版 android 系统
全栈技术负责人8 小时前
Hybrid应用性能优化实战分享(本文iOS 与 H5为例,安卓同理)
前端·ios·性能优化·html5
Zender Han9 小时前
Flutter 视频播放器——flick_video_player 介绍与使用
android·flutter·ios·音视频