ContextCompat.getColor () ignora NightMode

9

TL, DR;

ContextCompat.getColor()no usa los colores nocturnos ( values-night/colors.xml) aunque debería hacerlo cuando el modo nocturno está habilitado.

Aquí está el problema:

Hola a todos,

Así que estoy implementando un tema oscuro para mi aplicación de Android, llamo a esto para habilitarlo: AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);

He establecido colores values/colors.xmly hay una versión oscura values-night/colors.xml. Los colores cambian bien dependiendo del modo nocturno, PERO:

cuando lo uso ContextCompat.getColor(getApplicationContext(), R.id.myColor), usa los colores normales ( values/colors.xml) y no los colores nocturnos ( values-night/colors.xml).

En mi build.gradle, he establecido estos:

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

¿Podría alguien decirme qué estoy haciendo mal?

PD: ya miré la siguiente pregunta y no responde a este problema /programming/57779661/contextcompat-getcolor-method-ignores-night-mode

Mathieu de Brito
fuente
1
No puedo reproducirlo, estoy usando appcompat 1.1.0 y ambos colores de XML y ContextCompat.getColor()devuelvo valores válidos después de forzar el modo nocturno. ¿Puedes elaborar tu pregunta con un fragmento de código (cuando cambias el modo nocturno / obtienes color)?
Pawel
1
Probablemente esté pasando un contexto no válido (ApplicationContext, por ejemplo) a getColor. ¿Podrías compartir cómo invocas getColor?
W0rmH0le
@ W0rmH0le sí, estaba pasando un ApplicationContext, ¡no sabía que necesitaba usar la actividad para que esto funcionara! ¿Podría dar esto como una respuesta oficial para que pueda marcar su respuesta como válida?
Mathieu de Brito
@Pawel Gracias por sus comentarios, me ayudó a saber que era un error en mi código :)
Mathieu de Brito
Me alegro de poder ayudar! Me enfrenté a problemas similares ... Al final, estaba usando el contexto de la aplicación como tú
W0rmH0le

Respuestas:

12

Me enfrenté a problemas similares con el modo nocturno. Algunas pantallas estaban bien, pero otras mantenían el tema regular. Al final, descubrí que estaba creando instancias de algunas vistas usando el contexto de la Aplicación en lugar del contexto de actividad actual. Por alguna razón, el contexto de la Aplicación no rastrea este tipo de información.

Por lo tanto, actualice su código para usar el contexto de actividad actual en lugar del contexto de la aplicación.

Para referencia para otros usuarios. Evitar:

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

Y use:

// 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
fuente
3
Applicationes un contexto "en bruto", siempre hará referencia a valores del estilo predeterminado y no tendrá en cuenta ninguna configuración. AppCompatActivitypor otro lado maneja configuraciones apropiadas y está vinculado a AppCompatDelegate.
Pawel
@Pawel muy buena adición a esta respuesta, ¡Gracias!
muetzenflo