J'utilise les fonctionnalités du mode jour/nuit d'Androids et j'aimerais ajouter une option à mon application pour AppCompatDelegate.MODE_NIGHT_AUTO
J'ai un problème, car mon application nécessite que certaines choses soient colorées par programme, et je ne peux pas savoir comment vérifier si l'application se considère en mode nuit ou jour. Sans cela, je ne peux pas définir de drapeau pour choisir les bonnes couleurs.
L'appel de AppCompatDelegate.getDefaultNightMode()
renvoie simplement AppCompatDelegate.MODE_NIGHT_AUTO, ce qui est inutile.
Je ne vois rien d'autre qui me dirait, mais il doit y avoir quelque chose?
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;
}
Si vous êtes développeur kotlin, vous pouvez utiliser le code ci-dessous pour juger du mode sombre.
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 -> {}
}
Pour en savoir plus sur le mode thème sombre
L'opérateur au niveau du bit dans Java (qui est utilisé dans la réponse de @ephemient) est différent dans kotlin donc le code peut ne pas être facilement convertible pour les débutants. Voici la version kotlin juste au cas où quelqu'un aurait besoin il:
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
}
}
Une solution très simple consiste à ajouter une ressource de chaîne comme celle-ci.
res/values / strings.xml
<string name="mode">Day</string>
res/values-night/strings.xml
<string name="mode">Night</string>
Et puis partout où vous devez le vérifier:
if (resources.getString(R.string.mode) == "Day") {
// Do Day stuff here
} else {
// Do night stuff here
}
Mais vous NE POUVEZ PAS appeler cela avant super.onCreate()
dans le cycle de vie d'une activité. Il renverra toujours "Day" avant onCreate
.