Android 深色模式适配总结
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 深色模式适配总结相关推荐
- android自动切换暗色,超实用!Android 深色模式适配(可定时开启的APP内主题切换管理工具)...
前言 前面分享了一篇"黑白化主题"的文,主要适用场景是不久就要到来的"清明"等时节或者是其他的国家公祭日什么的(一名成熟的程序员,要学会自己提产品需求). 今天 ...
- Android深色模式适配原理分析,android应用开发
return when (resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK) { Configuration.UI ...
- Android 暗黑模式适配
Android 暗黑模式适配 不爱废话直接上菜. 第一种适配方式: 1.1 直接修改APP主题,values/styles.xml 如下: <style name="AppTheme& ...
- H5页面系统深色模式适配
1. 在css中设置CSS 媒体查询 PC web模式适配,在css中通过media查询进行适配即可生效. /*日间模式*/ @media (prefers-color-scheme: light) ...
- Web前端深色模式适配方案
众所周知,GitHub 网站在前不久支持了深色模式.我在看 GitHub 的时候发现浏览器默认的滚动条也变成了深色样式: 我当时猜测应该有一个属性可以声明配色方案,然后浏览器根据声明的配色方案采用相应 ...
- Android深色模式下,看不见字的解决办法
你去看看,看不见字的那些是不是都没有设置字体颜色! 设置一下字体颜色就好啦! 对于AlertDialog,千万不要用它自己的,要我们自己写好view,然后设置view,不然的话,深色模式下,你是很难修 ...
- Android暗黑模式适配
前言 最近这两年,用户关于支持暗黑模式的呼声越来越高.而友商也基本都上了暗黑模式,于是老板也要求我们年前得上,可是工作量太大了,200多个页面,一个人整,实在是没法年前发,就拖到了年后上. 成果 1. ...
- 实现页面适配_微信公众号文章页面适配深色模式
最近安卓微信7.0.10正式版发布,更新过后,很多用户发现,之前在测试版中对系统深色模式的适配功能被取消了,小伙伴们对此很是不满,好在Android 10系统手机用户占比很少,影响范围还不是很大,并且 ...
- iOS13适配深色模式(Dark Mode)
原文博客地址: iOS13适配深色模式(Dark Mode) 好像大概也许是一年前, Mac OS系统发布了深色模式外观, 看着挺刺激, 时至今日用着也还挺爽的 终于, 随着iPhone11等新手机的 ...
- iOS13适配深色模式(Dark Mode)总结
iOS13适配深色模式(Dark Mode)总结 好像大概也许是一年前, Mac OS系统发布了深色模式外观, 看着挺刺激, 时至今日用着也还挺爽的 终于,随着iPhone11等新手机的发售, iOS ...
最新文章
- Linux 设备驱动--- 阻塞型字符设备驱动 --- O_NONBLOCK --- 非阻塞标志【转】
- 信息系统项目管理师_信息系统项目管理师历史文章总结
- 【动态规划】最小代价问题
- Intel Haswell/Broadwell架构/微架构/流水线 (2)-流水线前端
- SQL中in参数在存储过程中传递及使用的方法
- 【数据库原理实验(openGauss)】创建数据库、表和索引
- iOS开发:报错The sandbox is not in sync with the Podfile.lock. Run ‘pod install‘ …的解决方法
- 计算机硬件常见的故障及维修方法,计算机硬件常见故障及解决方法
- 安卓一些错误经验积累
- python统计学课程_Python数据分析(统计分析)视频课程
- linux启用NAT功能,双网卡共享网络,iptables简单实现
- 【CXY】JAVA基础 之 JDBC
- CallStranger UPnP 漏洞曝光,影响数十亿台设备
- mysql的表面sno大全_学生表学号sno数据库
- 路由器可以当交换机用吗
- Android通用框架设计与完整电商APP开发系列文章
- 哈尔滨师范大学计算机科学与信息工程学院,计算机科学与信息工程学院邀殷明浩教授举办学术讲座...
- element-ui中el-cascader级联选择器多选判断是否是全选
- mysql查询逗号隔开的字段
- 汽车电子EMC电磁兼容测试标准 汽车电子电磁兼容检测项目
热门文章
- 无穷项和求极限(定积分)
- ps抠图怎么放大图片_ps中在使用抠图工具时如何用快捷键移动放大的原始图片?...
- 关于CSS居中显示的总结
- Ubuntu 16.04.5 (x86_64)下安装CUDA10 for 深度学习
- 红包裂变被动吸粉引流方法,如何通过红包裂变的方式吸粉
- java long转float_Java中为什么long能自动转换成float类型
- No HttpMessageConverter for com.ysd.entity.Users
- 求素数平均值c语言,C 输入10个正整数到a数组中,求a数组中素数的平均值.
- 免费书签管理工具:浏览器书签杂乱的整理方法
- 为什么计算机编程以英语为主,为什么英语对于编程来说非常重要