📜  如何在 Android 应用中实现暗(夜间)模式(1)

📅  最后修改于: 2023-12-03 15:24:06.874000             🧑  作者: Mango

如何在 Android 应用中实现暗(夜间)模式

在 Android 应用中实现暗(夜间)模式可以让用户在低光环境下使用应用,也可以降低眼睛疲劳和节省电池寿命。本文将介绍实现暗(夜间)模式的两种常用方法。

1. 使用 AppCompat DayNight 主题

AppCompat DayNight 主题是自 Android 8.0 (API 26) 开始提供的,它可以在应用中轻松实现暗(夜间)模式,而无需写基于 if 条件的样式。以下是实现步骤:

  1. 在 build.gradle 文件的 dependencies 中添加以下行:
implementation 'com.google.android.material:material:1.4.0'
  1. 在 styles.xml 文件中创建一个 DayNight 主题和一个基础(默认)主题,如下所示:
<!-- DayNight 主题 -->
<style name="AppTheme" parent="Theme.MaterialComponents.DayNight">
    <!-- 自定义主题属性 -->
</style>

<!-- 基础(默认)主题 -->
<style name="AppTheme.Light" parent="Theme.MaterialComponents.Light">
    <!-- 自定义主题属性 -->
</style>
  1. 在 onCreate 方法中调用 AppCompatDelegate.setDefaultNightMode(),设置默认主题模式,默认是 Light 主题:
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
  1. 在需要切换主题模式的地方调用 AppCompatDelegate.setDefaultNightMode(),设置不同的主题模式:
// 切换到 DayNight 模式
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);

// 切换到默认模式
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);

// 切换到跟随系统模式
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);
2. 使用自定义主题和样式

如果你不想使用 AppCompat DayNight 主题,或者需要更多自定义的选项,你也可以使用自定义主题和样式来实现暗(夜间)模式。以下是实现步骤:

  1. 在 styles.xml 文件中创建一个 DayNight 主题和一个基础(默认)主题,如下所示:
<!-- DayNight 主题 -->
<style name="AppTheme" parent="AppTheme.Base">
    <!-- 自定义主题属性 -->
</style>

<style name="AppTheme.Base" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <!-- 其他主题属性 -->
</style>

<!-- 基础(默认)主题 -->
<style name="AppTheme.Light" parent="AppTheme.Base">
    <!-- 自定义主题属性 -->
</style>
  1. 在 colors.xml 文件中定义暗(夜间)模式的颜色,如下所示:
<!-- 暗(夜间)模式的颜色 -->
<color name="colorPrimary_dark">#222</color>
<color name="colorPrimaryDark_dark">#000</color>
<color name="colorAccent_dark">#0ff</color>
<!-- 其他颜色 -->
  1. 在 values-night 文件夹中的 colors.xml 文件中定义 DayNight 主题的颜色,如下所示:
<!-- DayNight 主题的颜色 -->
<color name="colorPrimary">#777</color>
<color name="colorPrimaryDark">#444</color>
<color name="colorAccent">#f00</color>
<!-- 其他颜色 -->
  1. 在 res 文件夹中创建一个 values-night 文件夹,用于存储暗(夜间)模式的主题和样式。

  2. 在 res 文件夹中创建一个 attr.xml 文件,用于声明样式属性。在该文件中添加以下内容:

<resources>
    <attr name="colorPrimary" format="color" />
    <attr name="colorPrimaryDark" format="color" />
    <attr name="colorAccent" format="color" />
</resources>
  1. 在 styles.xml 文件中定义默认主题和样式、DayNight 主题和样式、暗(夜间)模式的主题和样式,如下所示:
<!-- 默认主题和样式 -->
<style name="AppTheme" parent="AppTheme.Base">
    <!-- 自定义主题属性 -->
</style>

<style name="AppTheme.Base" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <!-- 其他主题属性 -->
</style>

<!-- DayNight 主题和样式 -->
<style name="AppTheme.DayNight" parent="Theme.AppCompat.DayNight.NoActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <!-- 其他主题属性 -->
</style>

<!-- 暗(夜间)模式的主题和样式 -->
<style name="AppTheme.Dark" parent="AppTheme.Base">
    <item name="colorPrimary">@color/colorPrimary_dark</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark_dark</item>
    <item name="colorAccent">@color/colorAccent_dark</item>
    <!-- 其他主题属性 -->
</style>
  1. 在代码中切换主题和样式:
// 切换到 DayNight 主题和样式
setTheme(R.style.AppTheme_DayNight);

// 切换到暗(夜间)模式的主题和样式
setTheme(R.style.AppTheme_Dark);
总结

本文介绍了两种实现暗(夜间)模式的常用方法:使用 AppCompat DayNight 主题和使用自定义主题和样式。使用 AppCompat DayNight 主题可以轻松实现暗(夜间)模式,而无需写基于 if 条件的样式。使用自定义主题和样式可以实现更多自定义的选项。无论哪种方法,都可以提高应用的用户体验。