ContextCompat.getColor () ignoriert NightMode

9

TL, DR;

ContextCompat.getColor()verwendet nicht die Nachtfarben ( values-night/colors.xml), obwohl dies der Fall sein sollte, wenn der Nachtmodus aktiviert ist.

Hier ist das Problem:

Hallo allerseits,

Ich implementiere also ein dunkles Thema für meine Android-App. Ich nenne dies, um es zu aktivieren: AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);

Ich habe Farben eingestellt values/colors.xmlund dort dunkle Version in values-night/colors.xml. Die Farben ändern sich je nach Nachtmodus gut, ABER:

Wenn ich benutze ContextCompat.getColor(getApplicationContext(), R.id.myColor), werden die normalen Farben ( values/colors.xml) und nicht die Nachtfarben ( values-night/colors.xml) verwendet.

In meinem habe build.gradleich diese eingestellt:

implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.core:core-ktx:1.2.0-beta01'

Könnte mir bitte jemand sagen, was ich falsch mache?

PS: Ich habe mir bereits die folgende Frage angesehen und sie beantwortet dieses Problem nicht. Https://stackoverflow.com/questions/57779661/contextcompat-getcolor-method-ignores-night-mode

Mathieu de Brito
quelle
1
Ich kann es nicht reproduzieren. Ich verwende Appcompat 1.1.0 und beide Farben aus XML und gebe ContextCompat.getColor()nach dem Erzwingen des Nachtmodus gültige Werte zurück. Können Sie Ihre Frage mit einem Code-Snippet ausarbeiten (wenn Sie den Nachtmodus ändern / Farbe erhalten)?
Pawel
1
Sie übergeben wahrscheinlich einen ungültigen Kontext (z. B. ApplicationContext) an getColor. Könnten Sie bitte mitteilen, wie Sie getColor aufrufen?
W0rmH0le
@ W0rmH0le ja, ich habe einen ApplicationContext übergeben, ich wusste nicht, dass ich die Aktivität verwenden muss, damit dies funktioniert! Könnten Sie dies bitte als offizielle Antwort geben, damit ich Ihre Antwort als gültig markieren kann?
Mathieu de Brito
@ Pawel Vielen Dank für Ihr Feedback, es hat mir geholfen zu wissen, dass es ein Fehler in meinem Code war :)
Mathieu de Brito
Froh, dass ich helfen konnte! Ich hatte ähnliche Probleme ... Am Ende habe ich Anwendungskontext wie Sie verwendet
W0rmH0le

Antworten:

11

Ich hatte ähnliche Probleme mit dem Nachtmodus. Einige Bildschirme waren in Ordnung, andere behielten das reguläre Thema bei. Am Ende stellte ich fest, dass ich einige Ansichten mithilfe des Anwendungskontexts anstelle des aktuellen Aktivitätskontexts instanziierte. Aus irgendeinem Grund verfolgt der Anwendungskontext diese Art von Informationen nicht.

Aktualisieren Sie also Ihren Code, um den aktuellen Aktivitätskontext anstelle des Anwendungskontexts zu verwenden.

Als Referenz für andere Benutzer. Vermeiden:

ContextCompat.getColor(getApplicationContext(), R.id.myColor)

Und benutze:

// In a Activity
ContextCompat.getColor(this, R.id.myColor)

// In a View
ContextCompat.getColor(getContext(), R.id.myColor)

// In a Fragment (check against null because getColor can trigger a NPE
Context context = getContext()
if (context != null) {
    ContextCompat.getColor(context, R.id.myColor)
}
W0rmH0le
quelle
3
ApplicationWenn es sich um einen "rohen" Kontext handelt, werden immer Werte aus dem Standardstil referenziert und Konfigurationen ignoriert. AppCompatActivityAuf der anderen Seite werden die richtigen Konfigurationen verarbeitet und mit verknüpft AppCompatDelegate.
Pawel
@ Pawel sehr gute Ergänzung zu dieser Antwort, Danke!
Muetzenflo