Android 黑暗模式不跟随系统

在现代的移动应用中,黑暗模式已经成为了一种流行的设计趋势。许多应用都会根据系统的设置来自动切换到黑暗模式,以提供更好的用户体验。但有时候,我们可能需要在应用中设置一个独立的黑暗模式,而不是跟随系统设置。本文将介绍如何在 Android 应用中实现这一功能。

为什么需要独立的黑暗模式设置

有时候,我们可能会有一些特殊的设计需求,需要在应用中设置一个独立的黑暗模式。比如说,我们希望用户可以在应用内切换黑暗模式,而不受系统设置的影响。或者我们希望在某些特定的页面或功能中启用黑暗模式,而其他页面保持正常模式。

实现独立的黑暗模式设置

要实现独立的黑暗模式设置,我们可以通过在应用的设置中添加一个开关来控制黑暗模式的启用或禁用。当用户切换这个开关时,我们可以动态地改变应用的主题来实现黑暗模式。下面是一个简单的示例:

// 在 res/values 文件夹下创建一个 themes.xml 文件,定义两种主题:Light 和 Dark
<resources>
    <style name="AppTheme" parent="Theme.MaterialComponents.Light">
        <!-- Light 主题的样式 -->
    </style>

    <style name="AppTheme.Dark" parent="Theme.MaterialComponents">
        <!-- Dark 主题的样式 -->
    </style>
</resources>
// 在 res/values-night 文件夹下创建一个 themes.xml 文件,定义 Dark 主题的样式
<resources>
    <style name="AppTheme" parent="Theme.MaterialComponents">
        <!-- Dark 主题的样式 -->
    </style>
</resources>
// 在设置页面布局文件中添加一个 Switch 控件,用来控制黑暗模式的开关
<Switch
    android:id="@+id/darkModeSwitch"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Dark Mode"
    android:checked="false"
    />
// 在设置页面的 Activity 中添加代码来监听 Switch 控件的状态改变事件,并根据状态切换主题
Switch darkModeSwitch = findViewById(R.id.darkModeSwitch);
darkModeSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> {
    if (isChecked) {
        setTheme(R.style.AppTheme_Dark);
    } else {
        setTheme(R.style.AppTheme);
    }
    recreate();
});

通过以上代码,当用户在设置页面中切换黑暗模式的开关时,应用的主题会动态地改变,从而实现独立的黑暗模式设置。

序列图

下面是一个简单的序列图,展示了用户在设置页面中切换黑暗模式开关时的交互过程:

sequenceDiagram
    participant User
    participant Switch
    participant Activity
    User->>Switch: 点击黑暗模式开关
    Switch->>Activity: 触发状态改变事件
    Activity->>Activity: 根据状态切换主题

关系图

我们也可以通过一个关系图来展示应用中不同组件之间的关系:

erDiagram
    SETTING ||--o{ SWITCH : has
    ACTIVITY ||--o{ SWITCH : has

结尾

通过本文的介绍,我们了解了如何在 Android 应用中实现独立的黑暗模式设置。通过动态地改变应用的主题,我们可以让用户在应用内灵活地切换黑暗模式,而不受系统设置的影响。希望本文对你有所帮助,谢谢阅读!