您的位置:

实现Android应用的深色模式

深色模式,也称为夜间模式或黑暗模式,具有比常规模式更低的亮度和更高的对比度。在晚上或灰暗的环境中使用深色模式可以减少眼睛疲劳,有利于保护眼睛健康。此外,深色模式还可以节省电量和延长电池寿命。因此,实现Android应用的深色模式已经是一个很有必要的功能。

一、Android的深色模式

Android 10 (API Level 29)中引入了深色主题(Dark Theme)API,让 Android 应用程序能够在日间模式和夜间模式之间进行切换,同时还支持不根据时间自动切换模式等功能。在深色模式下,Android 会应用适当的颜色主题来替换 APP 中浅色的背景和前景色。对于 Android 应用程序,只需在 res/values 下建立一个对应的 dark 文件夹,在里面建立相同的 XML 文件,然后更改 AndroidManifest.xml 中的 android:theme.

二、应用的深色模式实现

深色模式可以通过两种方式实现:手动设置和跟随系统。不同的应用程序有不同的实现方式,但大致思路都相同,通过检测系统主题的更改来触发相应的样式处理。下面提供一个简单的示例,演示如何使用 AppCompat 库实现应用的深色模式。

1. 设置主题

在 styles.xml 文件中定义一个名为 AppTheme 的主题,并继承自 AppCompat 的日间主题。然后在 styles.xml (night) 文件中定义名为 AppDarkTheme 的主题,并继承自 AppCompat 的深色主题。这样,我们就有了日间和深色两个主题。例如:

<resources>
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowBackground">@color/background_light</item>
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:textColorPrimary">@color/textColorPrimaryLight</item>
        <item name="android:textColorSecondary">@color/textColorSecondaryLight</item>
    </style>

    <style name="AppDarkTheme" parent="Theme.AppCompat.NoActionBar">
        <item name="android:windowBackground">@color/background_dark</item>
        <item name="colorPrimary">@color/colorPrimaryDark</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:textColorPrimary">@color/textColorPrimaryDark</item>
        <item name="android:textColorSecondary">@color/textColorSecondaryDark</item>
    </style>
</resources>

2. 实现深色模式的开关按钮

在应用的设置界面添加一个深色模式的开关按钮。可以使用 Switch 按钮,示例如下:

<Switch
    android:id="@+id/switchDarkMode"
    android:text="@string/switch_dark_mode"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textColor="@color/colorBlack"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintEnd_toEndOf="parent"/>

3. 触发深色模式

使用以下代码控制应用程序的深色模式:

switchDarkMode.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        //检测当前系统主题
        int currentNightMode = getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
        switch (currentNightMode) {
            case Configuration.UI_MODE_NIGHT_NO:
                // 切换到深色模式
                AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
                break;
            case Configuration.UI_MODE_NIGHT_YES:
                // 切换到日间模式
                AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
                break;
        }
        // 重启该Activity以生效
        recreate();
    }
});

三、结语

深色模式可以给用户带来更好的使用体验和更低的眼睛疲劳。开发人员应该考虑支持深色模式,并实现相应的切换机制。随着 Android Q 中的深色主题 API 的出现,实现 Android 应用的深色模式变得更为容易。希望这篇文章可以为你实现深色模式提供一些帮助。

完整的代码示例: styles.xml:
<resources>
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowBackground">@color/background_light</item>
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:textColorPrimary">@color/textColorPrimaryLight</item>
        <item name="android:textColorSecondary">@color/textColorSecondaryLight</item>
    </style>
</resources>
styles.xml (night):
<resources>
    <style name="AppDarkTheme" parent="Theme.AppCompat.NoActionBar">
        <item name="android:windowBackground">@color/background_dark</item>
        <item name="colorPrimary">@color/colorPrimaryDark</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:textColorPrimary">@color/textColorPrimaryDark</item>
        <item name="android:textColorSecondary">@color/textColorSecondaryDark</item>
    </style>
</resources>
主界面布局 activity_main.xml:
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp">

    <TextView
        android:text="@string/app_name"
        android:textAppearance="@style/TextAppearance.AppCompat.Large"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"/>

    <TextView
        android:text="@string/hello_world"
        android:textAppearance="@style/TextAppearance.AppCompat.Medium"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"/>

    <Switch
        android:id="@+id/switchDarkMode"
        android:text="@string/switch_dark_mode"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textColor="@color/colorBlack"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"/>

</LinearLayout>
MainActivity.java:
public class MainActivity extends AppCompatActivity {

    private Switch switchDarkMode;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        switchDarkMode = findViewById(R.id.switchDarkMode);

        switchDarkMode.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //检测当前系统主题
                int currentNightMode = getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
                switch (currentNightMode) {
                    case Configuration.UI_MODE_NIGHT_NO:
                        // 切换到深色模式
                        AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
                        break;
                    case Configuration.UI_MODE_NIGHT_YES:
                        // 切换到日间模式
                        AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
                        break;
                }
                // 重启该Activity以生效
                recreate();
            }
        });
    }
}
实现Android应用的深色模式

2023-05-14
Android深色模式详解

2023-05-22
Android SDK:打造出色的Android应用

在如今智能手机的市场上,Android已经成为了最受欢迎的操作系统之一。随着移动应用的需求日益增加,Android应用的开发者数量也在不断增长。在这个过程中,可以看到Android SDK成为了一个必

2023-12-08
如何为Android应用实现沉浸式状态栏

2023-05-14
使用Python实现Android应用的深层链接

在移动互联网时代,应用程序的深层链接变得越来越重要。通过深层链接,用户可以从一个应用程序中跳转到另一个应用程序的特定页面,而不是只跳到该应用程序的主要页面。这种跳转方式不仅提高了用户的使用体验,同时也

2023-12-08
让你的Android应用更吸引人的颜色设计

颜色是视觉设计中一个非常重要的元素。在Android应用中,合理的颜色设计可以提高用户体验,进而提高用户满意度和留存率。本文将从多个方面介绍如何让你的Android应用的颜色更吸引人。 一、色彩搭配原

2023-12-08
Android透明的实现与应用

2023-05-18
提高Android应用性能的关键:深入理解Android R

2023-05-14
Android中使用观察者模式实现数据更新实时通知

一、什么是观察者模式? 观察者模式(Observer Pattern)是一种设计模式,用于当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。该模式也称作发布-订阅模式(Publis

2023-12-08
Android 颜色代码表:快速查找对应配色

2023-05-14
提高Android应用UI设计美感的小技巧:透明色使用

2023-05-19
VirtualAPK:轻松实现Android应用模块化

2023-05-20
Android自定义View:掌握Canvas和Paint实

2023-05-14
Android架构模式:MVC、MVP、MVVM,及其实现方

在Android开发中,选择合适的架构模式对于项目的开发和后期维护都是至关重要的。Android中常用的架构模式包括MVC、MVP和MVVM。本文将深入探讨这三种架构模式的原理、实现方式以及优缺点,帮

2023-12-08
Android应用链接实现指南

一、什么是应用链接 应用链接是Android系统提供的一种机制,允许应用程序与网页进行深度链接,当用户点击网页上的链接时,可以直接打开相关联的应用程序,而不是弹出浏览器。 应用链接需要在应用程序中配置

2023-12-08
使用Android Tint提升应用图标体验

Android应用图标是用户对于应用的第一印象,一个美观、独特的应用图标能够更好的吸引用户下载和使用。在Android系统中,我们可以使用Android Tint来处理应用图标,从而为用户提供更好的体

2023-12-08
阿里云笔记的功能与使用详解

2023-05-21
Android应用设置状态栏颜色的方法

2023-05-14
提高Android应用安全性的有效工具-网络数据包分析

2023-05-14
使用Timber库实现Android应用日志记录和管理

一、什么是Timber库 Timber是一个Android库,它提供了应用程序日志记录和管理的功能。与使用Android内置的Log类相比,Timber提供了更好的灵活性和可读性,具体表现在以下几个方

2023-12-08