Android-使用AppCompatDelegate.mode\u night\u AUTO时如何检测夜间模式是否开启

Android-使用AppCompatDelegate.mode\u night\u AUTO时如何检测夜间模式是否开启,android,android-night-mode,Android,Android Night Mode,我正在使用Androids内置的日间/夜间模式功能,我想在我的应用程序中添加一个选项,用于AppCompatDelegate.mode\u night\u AUTO 但我遇到了一个问题,因为我的应用程序要求某些东西以编程方式着色,而我不知道如何检查应用程序是否认为自己处于夜间或日间模式。没有这一点,我无法设置一个标志来选择正确的颜色 调用AppCompatDelegate.getDefaultNightMode()只会返回AppCompatDelegate.MODE\u NIGHT\u AUTO

我正在使用Androids内置的日间/夜间模式功能,我想在我的应用程序中添加一个选项,用于
AppCompatDelegate.mode\u night\u AUTO

但我遇到了一个问题,因为我的应用程序要求某些东西以编程方式着色,而我不知道如何检查应用程序是否认为自己处于夜间或日间模式。没有这一点,我无法设置一个标志来选择正确的颜色

调用AppCompatDelegate.getDefaultNightMode()只会返回AppCompatDelegate.MODE\u NIGHT\u AUTO,这是无用的


我看不出还有什么能告诉我的,但一定有什么?

如果你是kotlin开发者,那么你可以使用下面的代码来判断黑暗模式

int nightModeFlags =
    getContext().getResources().getConfiguration().uiMode &
    Configuration.UI_MODE_NIGHT_MASK;
switch (nightModeFlags) {
    case Configuration.UI_MODE_NIGHT_YES:
         doStuff();
         break;

    case Configuration.UI_MODE_NIGHT_NO:
         doStuff();
         break;

    case Configuration.UI_MODE_NIGHT_UNDEFINED:
         doStuff();
         break;
}
 val mode = context?.resources?.configuration?.uiMode?.and(Configuration.UI_MODE_NIGHT_MASK)
    when (mode) {
        Configuration.UI_MODE_NIGHT_YES -> {}
        Configuration.UI_MODE_NIGHT_NO -> {}
        Configuration.UI_MODE_NIGHT_UNDEFINED -> {}
    }
更多关于黑暗主题模式的信息


如果您是kotlin开发人员,那么您可以使用下面的代码来判断暗模式

 val mode = context?.resources?.configuration?.uiMode?.and(Configuration.UI_MODE_NIGHT_MASK)
    when (mode) {
        Configuration.UI_MODE_NIGHT_YES -> {}
        Configuration.UI_MODE_NIGHT_NO -> {}
        Configuration.UI_MODE_NIGHT_UNDEFINED -> {}
    }
更多关于黑暗主题模式的信息


Java中的按位运算符(在@ephemient的答案中使用)是不同的 因此,对于初学者来说,代码可能不容易转换。以下是kotlin版本,以防有人需要:

    private fun isUsingNightModeResources(): Boolean {
        return when (resources.configuration.uiMode and 
Configuration.UI_MODE_NIGHT_MASK) {
            Configuration.UI_MODE_NIGHT_YES -> true
            Configuration.UI_MODE_NIGHT_NO -> false
            Configuration.UI_MODE_NIGHT_UNDEFINED -> false
            else -> false
    }
}

Java中的按位运算符(在@ephemient的答案中使用)是不同的 因此,对于初学者来说,代码可能不容易转换。以下是kotlin版本,以防有人需要:

    private fun isUsingNightModeResources(): Boolean {
        return when (resources.configuration.uiMode and 
Configuration.UI_MODE_NIGHT_MASK) {
            Configuration.UI_MODE_NIGHT_YES -> true
            Configuration.UI_MODE_NIGHT_NO -> false
            Configuration.UI_MODE_NIGHT_UNDEFINED -> false
            else -> false
    }
}

一个非常简单的解决方案是添加这样的字符串资源

res/values/strings.xml

<string name="mode">Day</string>
<string name="mode">Night</string>

但是您不能在活动生命周期中的
super.onCreate()
之前调用此函数。在创建时,它将始终返回
之前的“天”

一个非常简单的解决方案是添加这样的字符串资源

res/values/strings.xml

<string name="mode">Day</string>
<string name="mode">Night</string>
但是您不能在活动生命周期中的
super.onCreate()
之前调用此函数。在创建时,它将始终返回
之前的“天”

用于Xamarin.Android

if (Build.VERSION.SdkInt >= BuildVersionCodes.Froyo)
{
    var uiModeFlags = Application.Context.Resources.Configuration.UiMode & UiMode.NightMask;
    switch (uiModeFlags)
    {
        case UiMode.NightYes:
            // dark mode
            break;
        case UiMode.NightNo:
            // default mode
            break;
        default:
            // default mode
            break;
    }
}
else
{
// default mode
}
对于Xamarin.Android

if (Build.VERSION.SdkInt >= BuildVersionCodes.Froyo)
{
    var uiModeFlags = Application.Context.Resources.Configuration.UiMode & UiMode.NightMask;
    switch (uiModeFlags)
    {
        case UiMode.NightYes:
            // dark mode
            break;
        case UiMode.NightNo:
            // default mode
            break;
        default:
            // default mode
            break;
    }
}
else
{
// default mode
}

当我尝试在每个答案代码中获取当前主题时,我的UI测试遇到了问题。它每次都返回相同的值

因此,我在应用程序类中创建静态变量,并获取UI测试的主题:

@Theme
fun Context.getAppTheme(): Int? {
    val theme = when (resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK) {
        Configuration.UI_MODE_NIGHT_NO -> Theme.LIGHT
        Configuration.UI_MODE_NIGHT_YES -> Theme.DARK
        else -> null
    }

    Application.theme = theme

    return theme
}
在应用程序类中:

companion object {
    @Theme
    @RunNone var theme: Int? = null
}

也许它对某人有用

当我尝试在每个答案代码中获取当前主题时,我的UI测试遇到了问题。它每次都返回相同的值

因此,我在应用程序类中创建静态变量,并获取UI测试的主题:

@Theme
fun Context.getAppTheme(): Int? {
    val theme = when (resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK) {
        Configuration.UI_MODE_NIGHT_NO -> Theme.LIGHT
        Configuration.UI_MODE_NIGHT_YES -> Theme.DARK
        else -> null
    }

    Application.theme = theme

    return theme
}
在应用程序类中:

companion object {
    @Theme
    @RunNone var theme: Int? = null
}

也许它对某人有用

将应用程序更改为黑色主题后,我发现这一切都不起作用

AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
使用此方法更改应用程序后,是否有办法了解系统设置?
谢谢,

FF

在使用将应用程序更改为黑暗主题后,我发现这一切都不起作用

AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
使用此方法更改应用程序后,是否有办法了解系统设置?
谢谢,

FF

谢谢,这就成功了。我开始检查一个颜色字符串值,看看它来自哪个资源文件,但这更好!请引述你的消息来源@StarWind0我没有找到任何其他答案;这个答案完全来自API文档。谢谢,这就成功了。我开始检查一个颜色字符串值,看看它来自哪个资源文件,但这更好!请引述你的消息来源@StarWind0我没有找到任何其他答案;这个答案完全来源于API文档。when的可能副本不是详尽无遗的,否则对未定义的caseGood解决方案更好,正是我所需要的when不是详尽无遗的,否则对未定义的caseGood解决方案更好,正是我所需要的,我为任何有同样“问题”的人回答我的问题。我为任何有同样“问题”的人回答我的问题。