Android Q 深色主题

简介: 从Support Library 23.2.0 开始,AppCompat 新增了主题:`Theme.AppCompat.DayNight`。其允许APP在 `深色主题` 和 `亮色主题` 之间切换;可以大幅减少耗电量(`OLED显示屏`的设备上,`深色主题`较`亮色主题` 有更加持久的续航能力);改善弱视以及对强光敏感的用户的可视性;让所有人都可以在光线较暗的环境中更轻松地使用设备,从而提升用户体验。

Android Q 深色主题举例

在这里插入图片描述

了解深色主题如何应用,第一手资料是 官方文档 与 相应的 官方 Sample

官方文档:DayNight — Adding a dark theme to your app:
https://medium.com/androiddevelopers/appcompat-v23-2-daynight-d10f90c83e94
官方文档:Dark theme:
https://developer.android.com/preview/features/darktheme
官方案例:android-DarkTheme
https://github.com/googlearchive/android-DarkTheme

一、深色主题简介

从Support Library 23.2.0 开始,AppCompat 新增了主题:Theme.AppCompat.DayNight

  • 其允许APP在 深色主题亮色主题 之间切换
  • 可以大幅减少耗电量(OLED显示屏的设备上,深色主题亮色主题 有更加持久的续航能力)
  • 改善弱视以及对强光敏感的用户的可视性
  • 让所有人都可以在光线较暗的环境中更轻松地使用设备,从而提升用户体验

而从Android Q(10.0)开始,Android设置中新增 深色主题背景 切换按钮(设置-显示-深色主题背景)。
在这里插入图片描述
因此Android App支持夜间模式,需提上开发日程了...

二、如何使用

2.1 主题设置

APP主题需继承Theme.AppCompat.DayNightTheme.MaterialComponents.DayNight,以下为代码举例。

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.DayNight">
    <!-- Customize your theme here. -->
</style>

2.2 监听Android Q 系统主题变化

若需要监听系统主题,例如设置-显示-深色主题背景 切换动作。

Activity添加android:configChanges="uiMode"

<activity
        android:name=".MyActivity"
        android:configChanges="uiMode" />

Activity中重写 onConfigurationChanged 方法

/**
 * Android系统设置中 "设置-显示-深色主题背景" 切换后,回调该方法
 */
Override
public void onConfigurationChanged(@NonNull Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    int mSysThemeConfig = newConfig.uiMode & Configuration.UI_MODE_NIGHT_MASK;
    switch (mSysThemeConfig) {
        // 亮色主题
        case Configuration.UI_MODE_NIGHT_NO:
            break;
        // 深色主题
        case Configuration.UI_MODE_NIGHT_YES:
            break;
    }
}

2.3 切换App主题

App 中切换应用主题,首先需调用AppCompatDelegate.setDefaultNightMode(int mode)方法,并调用recreate()方法使更改生效。

// 切换到 深色主题
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
// 需调用 recreate() ,从而使更改生效
recreate();

AppCompatDelegate.setDefaultNightMode(int mode)方法有四个参数选项,具体介绍如下:

// 亮色主题
ThemeHelper.Mode.LIGHT
// 暗色主题
ThemeHelper.Mode.DARK
// 跟随 系统设置(系统深色模式,则深色模式;系统浅色模式,则浅色模式)
AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM
// 省电模式时 深色模式;非省点模式时 浅色模式
AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY

2.4 监听App主题变化

若需要监听App的主题变更,可重写以下方法

/**
 * 回调当前应用的使用主题
 */
@Override
protected void onNightModeChanged(int mode) {
    super.onNightModeChanged(mode);
    switch (mode) {
            // 亮色主题
        case AppCompatDelegate.MODE_NIGHT_NO:
            break;
            // 暗色主题
        case AppCompatDelegate.MODE_NIGHT_YES:
            break;
            // 省电模式时 深色模式;非省点模式时 浅色模式
        case AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY:
            break;
            // 跟随 系统设置(系统深色模式,则深色模式;系统浅色模式,则浅色模式)
        case AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM:
            break;
    }
}

2.5 自定义背景颜色

  • 新建values-night文件夹

在这里插入图片描述

  • values/styles.xml 拷贝到values-night/styles.xml

values/styles.xmlvalues-night/styles.xml主题代码举例如下

values/styles.xml

<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.DayNight">
        <!-- Customize your theme here. -->
    </style>
</resources>

values-night/styles.xml

<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light">
        <!-- Customize your theme here. -->
    </style>
</resources>
  • values/colors.xml 拷贝到values-night/colors.xml

更改test_text_bg属性的颜色值

values/colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">@android:color/white</color>
    <color name="test_layout_bg">@android:color/white</color>
    <color name="test_text">@android:color/black</color>
    <color name="test_text_bg">#008577</color>
</resources>

values-night/colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">@android:color/black</color>
    <color name="test_layout_bg">@android:color/black</color>
    <color name="test_text">@android:color/white</color>
    <color name="test_text_bg">#D81B60</color>
</resources>

三、OK 完事大吉

案例源码下载地址:
https://github.com/AndroidAppCodeDemo/Android_Dark_Test

在这里插入图片描述

在这里插入图片描述

= THE END =

文章首发于公众号”CODING技术小馆“,如果文章对您有帮助,可关注我的公众号。
文章首发于公众号”CODING技术小馆“,如果文章对您有帮助,可关注我的公众号。
文章首发于公众号”CODING技术小馆“,如果文章对您有帮助,可关注我的公众号。

目录
相关文章
|
5月前
|
Android开发 开发者
Android UI设计: 请解释Activity的Theme是什么,如何更改应用程序的主题?
Android UI设计: 请解释Activity的Theme是什么,如何更改应用程序的主题?
126 1
|
4月前
|
Android开发 开发者
Android UI中的Theme定义了Activity的视觉风格,包括颜色、字体、窗口样式等。要更改主题
【6月更文挑战第25天】Android UI中的Theme定义了Activity的视觉风格,包括颜色、字体、窗口样式等。要更改主题,首先在`styles.xml`中定义新主题,如`MyAppTheme`,然后在`AndroidManifest.xml`中设置`android:theme`。可应用于全局或特定Activity。运行时切换主题需重置Activity,如通过`setTheme()`和`recreate()`方法。这允许开发者定制界面以匹配品牌或用户偏好。
38 2
|
XML 编译器 开发工具
Android | 说说从 android:text 到 TextView 的过程(主题&样式)
Android | 说说从 android:text 到 TextView 的过程(主题&样式)
223 0
Android | 说说从 android:text 到 TextView 的过程(主题&样式)
|
Android开发
Android 13 深色主题切换流程
Android 13 深色主题切换流程
|
XML 前端开发 定位技术
Android MVVM框架使用(十三)UI更新 (App启动白屏优化、适配Android10.0深色模式)
Android MVVM框架使用(十三)UI更新 (App启动白屏优化、适配Android10.0深色模式)
393 0
Android MVVM框架使用(十三)UI更新 (App启动白屏优化、适配Android10.0深色模式)
|
Shell 数据库 Android开发
【Android 性能优化】应用启动优化 ( 阶段总结 | Trace 文件分析及解决方案 | 源码分析梳理 | 设置主题的方案总结 ) ★
【Android 性能优化】应用启动优化 ( 阶段总结 | Trace 文件分析及解决方案 | 源码分析梳理 | 设置主题的方案总结 ) ★
273 0
|
Android开发
【Android 性能优化】应用启动优化 ( 主题背景图片设置 | 设置透明主题背景 | 设置应用启动主题背景、启动后恢复主题 )
【Android 性能优化】应用启动优化 ( 主题背景图片设置 | 设置透明主题背景 | 设置应用启动主题背景、启动后恢复主题 )
391 0
|
XML Android开发 数据格式
Android主题更换换肤
Android主题更换换肤文章目录知识总览认识setFactory获取任意一个apk压缩文件的Resource对象1、如何创建自定义的Resource实例2、如何知道当前属性值在所在Resource中的id参考文章知识总览android主题换肤通常借助LayoutInflater#setFactory实现换肤。
970 0
|
Android开发 UED 数据格式
Android项目实战(七):Dialog主题Activity实现自定义对话框效果
原文:Android项目实战(七):Dialog主题Activity实现自定义对话框效果 想必大家都用过Dialog主题的Activity吧,用它来显示自定义对话框效果绝对是一个非常不错的选择。 即把activity交互界面以Dialog的形式展现出来,Dialog主题的Activity大小将以内容的宽高来决定 可以看到设置为Theme.
1780 0
下一篇
无影云桌面