NoneSet DefaultNightMode() работает только после второго вызова в PreferenceFragment

Я работаю над темным режимом в моем приложении. Сейчас я пытаюсь переключить режим пользовательского интерфейса между светлым и темным с помощью PreferenceFragment вложенный в AppCompatActivity, Приложение ведет себя так, начиная со светлой темы в качестве значения по умолчанию:

  • Если я выберу "темный" в ListPreference, сводка предпочтений изменится, но пользовательский интерфейс останется светлым в этом и во всех других действиях.
  • Если я выберу "темный" во второй раз, действие переключится на темную тему, а также другие действия в backstack.
  • То же самое происходит наоборот, когда я хочу вернуться к светлой теме.

Так что в основном все работает, но вы должны выбрать нужное значение в ListPreference дважды. Код для ListPreference:

final Preference listPreferenceDesign = findPreference(PREF_DESIGN);
listPreferenceDesign.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
    @Override
    public boolean onPreferenceChange(Preference preference, Object o) {
            if (((ListPreference) preference).getValue().equals("light")) {
                AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
            } else if (((ListPreference) preference).getValue().equals("dark")) {
                AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
            }
            return true;
    }
});

Что я пробовал до сих пор:

  • Вызов getActivity.recreate()перед return true; заявление
  • Вызов getActivity.recreate()после небольшой задержки с помощью Handler
  • Вызов this.recreate() в onResume() Метод родительской активности при логическом changedDesignSetting было правдой

Я благодарен за дальнейшую помощь.

1 ответ

Я, наконец, заставить его работать, используя OnSharedPreferenceChangeListener в родительской деятельности. Теперь код в родительском действии выглядит так:

getFragmentManager().beginTransaction().replace(R.id.settingsPlaceholderID, preferenceFragment).commit();
SharedPreferences.OnSharedPreferenceChangeListener sharedPreferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
    @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
        if (key.equals(PREF_DESIGN)) {
            if (sharedPreferences.getString(key, "light").equals("light")) {
                AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
            } else {
                AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
            }
        }
    }
};

SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
sharedPreferences.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);

И в PreferenceFragment у меня есть только:

final Preference listPreferenceDesign = findPreference(PREF_DESIGN);
listPreferenceDesign.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
    @Override
    public boolean onPreferenceChange(Preference preference, Object o) {           
        return true;
    }
});
Другие вопросы по тегам