Android-使用AppCompatDelegate.mode\u night\u AUTO时如何检测夜间模式是否开启
我正在使用Androids内置的日间/夜间模式功能,我想在我的应用程序中添加一个选项,用于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
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解决方案更好,正是我所需要的,我为任何有同样“问题”的人回答我的问题。我为任何有同样“问题”的人回答我的问题。