AppCompat MODE_NIGHT_AUTO не работает
AppCompatDelegate.MODE_NIGHT_AUTO не обновляет мою текущую активность, и я не уверен, почему.
Я динамически разрешаю пользователю менять ночной режим. Если пользователь меняет режим на автоматический, я устанавливаю ночной режим по умолчанию, а затем воссоздаю действие:
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_AUTO);
recreate();
Если я изменю на MODE_NIGHT_YES или MODE_NIGHT_NO, он будет работать как положено. Если я изменю на MODE_NIGHT_AUTO, он перейдет к правильной темной / светлой теме, но затем не сможет обновить активность после перехода со дня на ночь. Это вроде отстой, чтобы проверить это, потому что мне приходится ждать восхода / захода солнца (РЕДАКТИРОВАТЬ: очевидно, я могу вручную изменить время на устройстве, а не ждать... пока разрешение на местоположение не используется).
Нужно ли выполнять ручную проверку флага ночного режима в onresume и вручную обновлять ресурсы для существующих действий, или я делаю что-то не так? Если я поверну устройство и после заката игра будет воссоздана, то темная тема будет правильно выбрана, но перед вращением она все равно будет отображать светлую тему.
Поддержка lib 23.4.0, версия Android 6.0.
2 ответа
В случае, если кто-то еще хочет знать, что я сделал, чтобы решить эту проблему (хотя не уверен, что это правильный способ сделать это):
private int mCurrentNightMode;
@Override
protected void onCreate(Bundle savedInstanceState) {
mCurrentNightMode = getCurrentNightMode();
}
@Override
protected void onPostResume() {
super.onPostResume();
if (hasNightModeChanged()) {
delayedRecreate();
}
}
private void delayedRecreate() {
Handler handler = new Handler();
handler.postDelayed(this::recreate, 1);
}
private boolean hasNightModeChanged() {
getDelegate().applyDayNight();
return mCurrentNightMode != getCurrentNightMode();
}
private int getCurrentNightMode() {
return getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
}
Это было исправлено в AppCompat 24.2.0. История изменений перечисляет это как "изменение поведения" для 24.2.0:
Если вы используете дневную / ночную функциональность библиотеки appcompat, система теперь автоматически воссоздает вашу активность каждый раз, когда меняется дневной / ночной режим (либо из-за времени суток, либо из-за вызова AppCompatDelegate.setLocalNightMode()).