У меня тоже была эта проблема, а затем я воспользовался советом Криса Бейнса в официальном блоге Google Android Разработчики https://medium.com/androiddevelopers/appcompat-v23-2-daynight-d10f90c83e94, чтобы сначала установить setDefaultNightMode
в классе приложения, поэтому я создал класс EcwgApplication, расширяющий Application, как он показывает, и добавил android:name=".EcwgApplication"
в раздел application
манифеста. Я также поместил свой метод переключения тем в класс приложения, который может вызывать моя активность по настройкам, когда пользователь изменяет настройку темы (в дополнение к обновлению SharedPreferences изменением перед вызовом), так что это выглядит так:
public class EcwgApplication extends Application {
public void onCreate() {
super.onCreate();
int selectedDarkLightTheme = PreferenceManager.getDefaultSharedPreferences(this).getInt(getString(R.string.preferences_dark_light_mode_selected_key), AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);
AppCompatDelegate.setDefaultNightMode(selectedDarkLightTheme);
}
public static void setDarkLightTheme(int selectedDarkLightTheme) {
AppCompatDelegate.setDefaultNightMode(selectedDarkLightTheme);
}
}
Это прекрасно работало с Android версиями ОС с 24 по 29, но с 21 (самая низкая версия, поддерживаемая этим приложением) до 23 я получал черный экран при возвращении к первому действию и при вращении экран исправил бы это, он также дал понять, что состояние пользовательского интерфейса не было сохранено. Поэтому я изменил StartActivity для экрана «Настройки» на StartActivityForResult, и в onActivityResult проверил, номер версии <= 23, и если да, то <code>this.recreate().
Мне нужно продолжать проводить больше тестов, но, по крайней мере, пока все работает отлично.