实现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();
            }
        });
    }
}

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/308759.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2025-01-03 14:49
下一篇 2025-01-03 14:49

相关推荐

  • 手机安全模式怎么解除?

    安全模式是一种手机自身的保护模式,它会禁用第三方应用程序并使用仅限基本系统功能。但有时候,安全模式会使你无法使用手机上的一些重要功能。如果你想解除手机安全模式,可以尝试以下方法: …

    编程 2025-04-28
  • Android ViewPager和ScrollView滑动冲突问题

    Android开发中,ViewPager和ScrollView是两个常用的控件。但是当它们同时使用时,可能会发生滑动冲突的问题。本文将从多个方面介绍解决Android ViewPa…

    编程 2025-04-28
  • Android如何点击其他区域收起软键盘

    在Android应用中,当输入框获取焦点弹出软键盘后,我们希望能够点击其他区域使软键盘消失,以提升用户体验。本篇文章将说明如何实现这一功能。 一、获取焦点并显示软键盘 在Andro…

    编程 2025-04-28
  • Qt State Machine与状态机模式

    本文将介绍Qt State Machine和状态机模式在Qt中的实现。Qt提供了QStateMachine和QState两个类,可以方便地实现状态机模式,并且能有效地处理复杂的、多…

    编程 2025-04-27
  • 显示C++设计模式

    本文将详细介绍显示C++设计模式的概念、类型、优点和代码实现。 一、概念 C++设计模式是在软件设计阶段定义,用于处理常见问题的可重用解决方案。这些解决方案是经过测试和验证的,并已…

    编程 2025-04-27
  • Android Studio HUD 实现指南

    本文将会以实例来详细阐述如何在 Android Studio 中使用 HUD 功能实现菊花等待指示器的效果。 一、引入依赖库 首先,我们需要在 build.gradle 文件中引入…

    编程 2025-04-27
  • Android和Vue3混合开发方案

    本文将介绍如何将Android和Vue3结合起来进行混合开发,以及其中的优势和注意事项。 一、环境搭建 在进行混合开发之前,需要搭建好相应的开发环境。首先需要安装 Android …

    编程 2025-04-27
  • Centos7进入单用户模式的解释

    本文将介绍如何在Centos7中进入单用户模式,并从以下几个方面进行详细的阐述。 一、Centos7进入单用户模式的解答 在Centos7中进入单用户模式需要执行以下步骤: 1. …

    编程 2025-04-27
  • Android Java Utils 可以如何提高你的开发效率

    Android Java Utils 是一款提供了一系列方便实用的工具类的 Java 库,可以帮助开发者更加高效地进行 Android 开发,提高开发效率。本文将从以下几个方面对 …

    编程 2025-04-27
  • Android JUnit测试完成程序自动退出决方法

    对于一些Android JUnit测试的开发人员来说,程序自动退出是一个经常面临的困扰。下面从多个方面给出解决方法。 一、检查测试代码 首先,我们应该仔细检查我们的测试代码,确保它…

    编程 2025-04-25

发表回复

登录后才能评论