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()).

Другие вопросы по тегам