web-dev-qa-db-fra.com

Android - Comment détecter si le mode nuit est activé lors de l'utilisation d'AppCompatDelegate.MODE_NIGHT_AUTO

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?

30
Ben987654
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;
}
25
ephemient

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

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

2
Saurabh Khare

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
    }
}
0
Ali Nem

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.

0
just_user