1、Force Dark
一种能让应用程序快速适配深色主题,Force Dark的工作原理是系统会分析浅色主题应用下的每一层View,并且在这些View绘制到屏幕之前,自动将它们的颜色转换成更加适合深色主题的颜色。注意,只有原本使用浅色主题的应用才能使用这种方式,如果你的应用原本使用的就是深色主题,Force Dark将不会起作用。
右击res目录 -> New -> Directory,创建一个values-v29目录,然后右击values-v29目录 -> New -> Values resource file,创建一个styles.xml文件。接着对这个文件进行编写,代码如下所示:

<resources><style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"><item name="colorPrimary">@color/colorPrimary</item><item name="colorPrimaryDark">@color/colorPrimaryDark</item><item name="colorAccent">@color/colorAccent</item><item name="android:forceDarkAllowed">true</item></style>
</resources>

除了android:forceDarkAllowed属性之外,其他的内容都是从之前的styles.xml文件中复制过来的。这里给AppTheme主题增加了android:forceDarkAllowed属性并设置为true,说明现在我们是允许系统使用Force Dark将应用强制转换成深色主题的。另外,values-v29目录是只有Android 10.0及以上的系统才会去读取的,因此这是一种系统差异型编程的实现方式。
2、values-night适配
(1)将AppTheme的parent主题指定成了Theme.AppCompat.DayNight.NoActionBar ,这是一种DayNight主题。因此,在普通情况下MaterialTest项目仍然会使用浅色主题,和之前并没有什么区别,但是一旦用户在系统设置中开启了深色主题,MaterialTest项目就会自动使用相应的深色主题
(2)创建values-night目录,增加color.xml
color.xml中的颜色命名与values目录下的color.xml中的命名相同,在普通情况下,系统仍然会读取values/colors.xml文件中的颜色值,而一旦用户开启了深色主题,系统就会去读取values-night/colors.xml文件中的颜色值了。
如果适配图片的话,就创建对应的 drawable-night目录
3、切换主题
黑暗模式和正常模式,无非就是两种主题间的切换(主要是各种背景色,字体颜色和Icon)。因此我们只需要定义两套不同的主题,根据是否是黑暗模式进行主题的切换即可
(1)判断当前是否处于黑暗模式:用于启动时还在不同的主题

//检查当前系统是否已开启暗黑模式public static boolean getDarkModeStatus(Context context) {int mode = context.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;return mode == Configuration.UI_MODE_NIGHT_YES;}

(2)定义两套主题(正常模式和黑暗模式):即在style文件下自定义两个style,但是必须指定parent为‘Theme.AppCompat.DayNight.DarkActionBar’,如下所示:

//正常模式下的主题<style name="main_theme_light" parent="Theme.AppCompat.DayNight.DarkActionBar"><item name="windowActionBar">false</item><item name="windowNoTitle">true</item><item name="main_text_color">@color/main_text_color_light</item><item name="main_bg_color">@color/main_bg_color_light</item></style>//黑暗模式下的主题<style name="main_theme_dark" parent="Theme.AppCompat.DayNight.DarkActionBar"><item name="windowActionBar">false</item><item name="windowNoTitle">true</item><item name="main_text_color">@color/main_text_color_dark</item><item name="main_bg_color">@color/main_bg_color_dark</item></style>

(3)找出适配黑暗模式需要的属性(主要是颜色属性:背景色、字体颜色和Icon颜色等并给属性赋值),类似如下定义:

 <!--    主要字体颜色--><attr name="main_text_color" format="color" /><!--    主要背景颜色-->    <attr name="main_bg_color" format="color" />//不同模式下的颜色属性值<color name="main_text_color_light">#000000</color><color name="main_text_color_dark">#ffffff</color><color name="main_bg_color_light">#ffffff</color><color name="main_bg_color_dark">#000000</color>

(4)在activity和xml中引用我们自定义的属性:
//在xml文件中使用我们自定义属性

<androidx.constraintlayout.widget.ConstraintLayout 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="?attr/main_bg_color"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello World!"android:textColor="?attr/main_text_color"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /></androidx.constraintlayout.widget.ConstraintLayout>

(5)在BaseActivity中切换不同的主题,才能使我们自定义的属性生效,必须在setContentView()方法前设置:
//在BaseActivity中切换不同的主题,才能使我们自定义的属性生效,必须在setContentView()方法前设置:

 @Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {if (getDarkModeStatus(this)) {setTheme(R.style.main_theme_dark);}else {setTheme(R.style.main_theme_light);}setContentView(R.layout.activity_main)}

//为达到更好的适配效果,可在xml文件的activity节点下加入如下属性:
android:configChanges="uiMode

tips:
1、监听深色主题是否开启
1)在清单文件中给对应的Activity配置 android:configChanges=“uiMode”
2)在onConfigurationChanged方法中获取:

@Override
public void onConfigurationChanged(@NonNull Configuration newConfig) {super.onConfigurationChanged(newConfig);int currentNightMode = newConfig.uiMode & Configuration.UI_MODE_NIGHT_MASK;switch (currentNightMode) {case Configuration.UI_MODE_NIGHT_NO:Log.e("=======","=====关闭夜间模式====");// 关闭break;case Configuration.UI_MODE_NIGHT_YES:Log.e("=======","=====开启夜间模式====");// 开启break;default:break;}
}

2、判断深色主题是否开启

public static boolean isNightMode(Context context) {int currentNightMode = context.getResources().getConfiguration().uiMode &Configuration.UI_MODE_NIGHT_MASK;return currentNightMode == Configuration.UI_MODE_NIGHT_YES;
}

3、可以通过Force Dark来自动适配,然后再通过values-night适配来进行图片资源以及颜色等的适配。

Android Q 暗黑模式相关推荐

  1. android q 桌面模式,Android Q带来全新桌面模式

    IT之家3月14日消息 谷歌在美国当地时间3月13日(北京时间14日凌晨)正式推送了Android Q的首个Beta版本,"亲儿子"Pixel系列全系手机可以尝鲜体验这最新的系统. ...

  2. Android微信暗黑模式的方法,微信“暗黑”模式来了!设置方法拿走不谢

    盼望着,盼望着 暗黑模式来啦! 小编问问大家 你们已经更新了吗? 3月上旬,微信方面表示 为了优化用户体验 微信与苹果达成合作 共同探索微信在iOS系统的深色模式体验 目前该功能已完成开发 将有望在下 ...

  3. Android Q暗色模式适配踩坑—状态栏

    暗色模式已经不是什么新鲜玩意了,大家最近看到关于暗色模式最多的内容可能就是iOS版本微信未适配暗色模式面临被AppStore下架的风险.然后今天早上一醒来,发现Android的微信也黑了(因为我手机一 ...

  4. Android 适配暗黑模式

    在样式中添加 <style name="MyAppTheme">.......<item name="android:forceDarkAllowed& ...

  5. android q pc模式,安卓Q新增原生桌面模式:手机连接显示器变主机 心疼老罗!

    去年,锤子科技的创始人罗永浩在坚果R1的发布会上推出了坚果TNT工作站,坚果手机可充当"主机"与坚果TNT组成一个"桌面级电脑".但是坚果TNT工作站并没有如期 ...

  6. 开启Android Q DarkMode | 开启Android Q深色模式 夜间模式

    1.首先下载Image 注意,这里最好是下载google APIs Intel x86 System Image 2.创建虚拟机,启动模拟器 如果报错HAXM 没有安装的话,请安装一下 注意,这个HA ...

  7. Android App Dark Theme(暗黑模式)适配指南,android实战mysql

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v2qd7l5a-1636430548017)(https://user-gold-cdn.xitu.io/2020/3/ ...

  8. Android App Dark Theme(暗黑模式)适配指南

    在 2019 年的 Google I/O 和 Apple WWDC 上,新露面的 Android 10 和 iOS 13 都宣布将支持 Dark Theme 也就是我们常说的暗黑模式,并提供相关 AP ...

  9. Android webView适配H5暗黑模式

    第一步 首先Android 必须是Q 就是10.0才能支持暗黑模式 第二步 设置Android webView暗黑模式 WebViewFeature必须引入这个包 implementation 'an ...

最新文章

  1. 036_jQuery Ajax全局回调函数
  2. linux命令0424
  3. CentOS7中解压tar包的方式安装Nginx
  4. 编写高性能Web应用程序的10个技巧
  5. (轉貼) ThinkPad鍵盤設計原理和哲學 (NB) (ThinkPad)
  6. HierarchicalDataTemplate中的ContextMenu的Command绑定
  7. 【计算机视觉】人脸识别总结
  8. 实验九 哈希表的查找操作
  9. 大学生 计算机 毕业设计 xx管理系统 毕设(1)
  10. Chrome下载离线安装包的方法
  11. CCA分析图如何解读_微生物群落与环境因子关联:全自动的CCA/RDA分析流程!!...
  12. Excel表格中将两个或多个单元格内容合并为一个单元格的内容
  13. Excel VLOOKUP实用教程之 08 VLOOKUP如果实现区分大小写的查找?(教程含数据excel)
  14. 灵感来了挡也挡不住,基于Redis解决业务场景中延迟队列
  15. windows系统bat批处理 电子教室加卡他卡 伽卡他卡学生端暴力关闭 无敌版
  16. 小白如何快速创建一个属于自己的APP
  17. UVA_12676_Inverting Huffman(哈夫曼树)
  18. ASP.NET EXCEL导入,身份证、手机号长度校验数据校验
  19. 《数据库系统》(四) 概念数据库设计
  20. 【目标检测】Detection in Crowded Scenes: One Proposal, Multiple Predictions

热门文章

  1. 怎么集成穿山甲(今日头条广告SDK)
  2. 个人永久性免费-Excel催化剂功能第71波-定义名称管理器维护增强
  3. termux使用教程python-Termux折腾记--进阶之python库使用
  4. 配置Apache+Tomcat+mod_jk软件环境
  5. 思维模型 乔哈里视窗
  6. 微信小助手WeChatExtension中文版v1.7.8支持最新版
  7. IpMsg代码分析(三)
  8. 运用PyTorch动手搭建一个共享单车预测器
  9. java抽组件_GitHub - ysc/HtmlExtractor: HtmlExtractor是一个Java实现的基于模板的网页结构化信息精准抽取组件。...
  10. 计算机主板和单片机的区别,单片机和工控机的作用和区别