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;
}
});