Android - 如何使用AppCompatDelegate.MODE_NIGHT_AUTO检测夜间模式是否打开

时间:2017-05-24 23:28:12

标签: android android-night-mode

我正在使用内置日/夜模式功能的Androids,我想为AppCompatDelegate.MODE_NIGHT_AUTO

的应用添加一个选项

我遇到了问题,因为我的应用程序需要以编程方式对某些内容进行着色,而我无法弄清楚如何检查应用程序是否在夜间或白天模式下考虑自己。没有它,我无法设置标志来选择正确的颜色。

调用AppCompatDelegate.getDefaultNightMode()只会返回无用的AppCompatDelegate.MODE_NIGHT_AUTO。

我没有看到任何其他可以告诉我的信息,但必定有什么内容?

7 个答案:

答案 0 :(得分:13)

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;
}

答案 1 :(得分:4)

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

res / values / strings.xml

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

res / values-night / strings.xml

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

然后在任何需要检查的地方:

if (resources.getString(R.string.mode) == "Day") {
    // Do Day stuff here
} else {
    // Do night stuff here
}

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

答案 2 :(得分:1)

对于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
}

答案 3 :(得分:0)

如果您是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 -> {}
    }

有关黑暗主题模式的更多信息

  

https://github.com/googlesamples/android-DarkTheme/

答案 4 :(得分:0)

Java中的按位运算符(在@ephemient的答案中使用)是不同的 在Kotlin中使用,因此对于初学者而言,该代码可能不容易转换。这是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
    }
}

答案 5 :(得分:0)

当我尝试在每个答案代码中获取当前主题时,我的 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
}

可能对某人有用!

答案 6 :(得分:-1)

在将应用程序更改为深色主题后,我发现没有任何效果

AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);

用这种方法换app后有没有办法知道系统设置?
谢谢,
FF