setDefaultNightMode() 仅在 PreferenceFragment 中第二次调用后有效

setDefaultNightMode() only works after second call in PreferenceFragment

我正在努力在我的应用中实现深色模式。现在,我尝试使用嵌套在 AppCompatActivity 中的 PreferenceFragment 在明暗模式之间切换 UI 模式。 App 的行为是这样的,从浅色主题开始为默认值:

所以基本上一切正常,但您必须 select 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;
    }
});

到目前为止我尝试了什么:

感谢您的进一步帮助。

我终于使用父 activity 中的 OnSharedPreferenceChangeListener 让它工作了。现在父 activity 中的代码如下所示:

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