Метод onConfigurationChanged() срабатывает 3 раза, и только 1-й раз с правильным значением
Проблема: когда я меняю системную тему на ночную, то метод onConfigurationChanged срабатывает 3 раза (один из них для темы), но тема ночная только в первом из трёх, а остальные содержат инфу что тема - DAY. Соответственно у меня метод который дергаетсядалее, берет в значение сначала NIGHT, а потом два раза DAY. Получается не могу прокинуть нормально значение и поменять состояние того что нужно.
То есть:
-При смене темы на темную, приходят значения по очереди: темная, светлая, светлая (информация о переключении смены на темную перекрывается двумя последующими срабатываниями метода onConfigurationChanged).
-При смене темы на светлую - метод срабатывает со значениями: светлая, светлая, светлая.
В Манифесте:
android:configChanges="orientation|screenSize|fontScale|uiMode"
Логи:
//смена системной темы на ночную:
2021-11-25 16:53:45/com.its.myapp.debug D/MainAct LOGS: onConfigurationChanged: SYSTEM_THEME = NIGHT
2021-11-25 16:53:45/com.its.myapp.debug D/MainAct LOGS: onConfigurationChanged: SYSTEM_THEME = DAY
2021-11-25 16:53:45/com.its.myapp.debug D/MainAct LOGS: onConfigurationChanged: SYSTEM_THEME = DAY
//смена системной темы на дневную:
2021-11-25 16:53:48/com.its.myapp.debug D/MainAct LOGS: onConfigurationChanged: SYSTEM_THEME = DAY
2021-11-25 16:53:48/com.its.myapp.debug D/MainAct LOGS: onConfigurationChanged: SYSTEM_THEME = DAY
2021-11-25 16:53:48/com.its.myapp.debug D/MainAct LOGS: onConfigurationChanged: SYSTEM_THEME = DAY
Код:
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
var isSystemNightMode = newConfig.uiMode and Configuration.UI_MODE_NIGHT_MASK
when (isSystemNightMode) {
Configuration.UI_MODE_NIGHT_YES -> {
Log.d(TAG, "onConfigurationChanged: SYSTEM_THEME = NIGHT")
}
Configuration.UI_MODE_NIGHT_NO -> {
Log.d(TAG, "onConfigurationChanged: SYSTEM_THEME = DAY")
}
}
}
Ответы (1 шт):
Единственный вариант что мне помог в данной ситуации - в конце срабатывания каждого onConfigurationChange() запускать функцию, спрашивающую систему "а действительно ли тема та, что указана в onConfigurationChanged()?"
Возможно, это - костыль, но всё работает.
Я написал так (функция внизу):
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
var isSystemNightMode = newConfig.uiMode and Configuration.UI_MODE_NIGHT_MASK
when (isSystemNightMode) {
Configuration.UI_MODE_NIGHT_NO -> {
Log.d(TAG, "onConfigurationChanged: SYSTEM_THEME = DAY")
getSystemTheme()
}
Configuration.UI_MODE_NIGHT_YES -> {
Log.d(TAG, "onConfigurationChanged: SYSTEM_THEME = NIGHT")
getSystemTheme()
}
}
}
private fun getSystemTheme() {
when (resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK) {
Configuration.UI_MODE_NIGHT_NO -> {
Log.d(TAG, "getSystemTheme: SYSTEM_THEME = DAY")
// далее кастомные функции при дневной теме
}
Configuration.UI_MODE_NIGHT_YES -> {
Log.d(TAG, "getSystemTheme: SYSTEM_THEME = NIGHT")
// далее кастомные функции при ночной теме
}
}
}