📅  最后修改于: 2023-12-03 15:24:06.874000             🧑  作者: Mango
在 Android 应用中实现暗(夜间)模式可以让用户在低光环境下使用应用,也可以降低眼睛疲劳和节省电池寿命。本文将介绍实现暗(夜间)模式的两种常用方法。
AppCompat DayNight 主题是自 Android 8.0 (API 26) 开始提供的,它可以在应用中轻松实现暗(夜间)模式,而无需写基于 if 条件的样式。以下是实现步骤:
implementation 'com.google.android.material:material:1.4.0'
<!-- DayNight 主题 -->
<style name="AppTheme" parent="Theme.MaterialComponents.DayNight">
<!-- 自定义主题属性 -->
</style>
<!-- 基础(默认)主题 -->
<style name="AppTheme.Light" parent="Theme.MaterialComponents.Light">
<!-- 自定义主题属性 -->
</style>
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
// 切换到 DayNight 模式
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
// 切换到默认模式
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
// 切换到跟随系统模式
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);
如果你不想使用 AppCompat 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>
<!-- 暗(夜间)模式的颜色 -->
<color name="colorPrimary_dark">#222</color>
<color name="colorPrimaryDark_dark">#000</color>
<color name="colorAccent_dark">#0ff</color>
<!-- 其他颜色 -->
<!-- DayNight 主题的颜色 -->
<color name="colorPrimary">#777</color>
<color name="colorPrimaryDark">#444</color>
<color name="colorAccent">#f00</color>
<!-- 其他颜色 -->
在 res 文件夹中创建一个 values-night 文件夹,用于存储暗(夜间)模式的主题和样式。
在 res 文件夹中创建一个 attr.xml 文件,用于声明样式属性。在该文件中添加以下内容:
<resources>
<attr name="colorPrimary" format="color" />
<attr name="colorPrimaryDark" format="color" />
<attr name="colorAccent" format="color" />
</resources>
<!-- 默认主题和样式 -->
<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>
// 切换到 DayNight 主题和样式
setTheme(R.style.AppTheme_DayNight);
// 切换到暗(夜间)模式的主题和样式
setTheme(R.style.AppTheme_Dark);
本文介绍了两种实现暗(夜间)模式的常用方法:使用 AppCompat DayNight 主题和使用自定义主题和样式。使用 AppCompat DayNight 主题可以轻松实现暗(夜间)模式,而无需写基于 if 条件的样式。使用自定义主题和样式可以实现更多自定义的选项。无论哪种方法,都可以提高应用的用户体验。