如何检测系统是否使用暗模式?

How to detect if system using dark mode?

我正在使用这个简单的功能来获得深色模式。我在共享首选项中存储一个布尔值。如果值不存在,我默认为 return false。

这是我的简单代码:

public static boolean getNightMode(){
        SharedPreferences pref = getApplicationContext().getSharedPreferences("nightMode", 0);
        return pref.getBoolean("nightMode",false);
    }

现在我不想 return 默认为 false,我想 return 系统暗模式状态。

我的意思是如果系统使用深色模式,return 正确。

我怎样才能做到这一点?

您可以使用配置设置。

int currentNightMode = getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
switch (currentNightMode) {
    case Configuration.UI_MODE_NIGHT_NO:
        // Night mode is not active, we're using the light theme
        break;
    case Configuration.UI_MODE_NIGHT_YES:
        // Night mode is active, we're using dark theme
        break;
}

详情请参考developer site

科特林:

val currentNightMode = configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK
when (currentNightMode) {
    Configuration.UI_MODE_NIGHT_NO -> {} // Night mode is not active, we're using the light theme
    Configuration.UI_MODE_NIGHT_YES -> {} // Night mode is active, we're using dark theme
}

我在我的设置 activity 中创建了 2 个切换开关,所以一个偏好表示是使用系统设置(即暗或亮)还是覆盖。然后如果它被设置为覆盖,那么我检查第二个偏好以查看用户是否想要暗模式或亮模式。

root_preference.xml

        <SwitchPreference
        app:key="@string/displayMode"
        app:title="Dark/Light Mode"
        app:summaryOn="Manual"
        app:summaryOff="Same As System"
        app:defaultValue="false" />

    <SwitchPreference
        app:dependency="@string/displayMode"
        app:key="@string/overideMode"
        app:title="Select Theme"
        app:summaryOn="Dark Mode"
        app:summaryOff="Light Mode"/>

MainActivity.java(在 onCreate 中)

        SharedPreferences userPref = androidx.preference.PreferenceManager.getDefaultSharedPreferences(getApplicationContext());

    //Use preference to set night or light mode
    if(userPref.getBoolean(getString(R.string.displayMode),false)){
        if(userPref.getBoolean(getString(R.string.overideMode), true)){
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
        } else {
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
        }
    }else{
        AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);
    }

要检测“系统”是否处于黑暗模式,您可以使用 getNightMode() 方法 UiModeManager class.

https://developer.android.com/reference/android/app/UiModeManager#getNightMode()

像这样,

UiModeManager uiModeManager = (UiModeManager) context.getSystemService(Context.UI_MODE_SERVICE);
    int mode = uiModeManager.getNightMode();
    if (mode == UiModeManager.MODE_NIGHT_YES) {
        // System is in Night mode
    } else if (mode == UiModeManager.MODE_NIGHT_NO) {
        // System is in Day mode
    }

如果想知道“您的应用”是否处于夜间模式,请参考@Lazy Ninja 的回答。