Search code examples
androidrefreshsettingspreferenceactivity

How do you refresh PreferenceActivity to show changes in the settings?


Based on the following code, can you tell me how to refresh the PreferenceActivity window to show changes in the settings immediately? For example: the user taps the master chime toggle checkbox to true (ticked), I would like the user to immediately see the other settings such as the ChimeOn15Past checkbox also be be true (ticked)

SharedPreferences.Editor prefEditor = clockSettings.edit(); // Allow the settings to be changed.

if (booleanMasterChimeToggle == true) {
    prefEditor.putBoolean("ChimeOnTheHour", true);
    prefEditor.putBoolean("ChimeOn15Past", true);
    prefEditor.putBoolean("ChimeOn30Past", true);
    prefEditor.putBoolean("ChimeOn45Past", true);

    strNotifyMessage = "Full chiming has now been set.";

} else {
    prefEditor.putBoolean("ChimeOnTheHour", false);
    prefEditor.putBoolean("ChimeOn15Past", false);
    prefEditor.putBoolean("ChimeOn30Past", false);
    prefEditor.putBoolean("ChimeOn45Past", false);

    strNotifyMessage = "Full chiming has now been disabled.";
}

Solution

  • Nikolay's answer is correct. I just want to add some code here to illustrate his point more clearly.

    private CheckBoxPreference mOn15Past;
    private CheckBoxPreference mOn30Past;
    private CheckBoxPreference mOn45Past;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        // Load the preferences from an XML resource
        addPreferencesFromResource(R.xml.preferences);
    
        mOn15Past = (CheckBoxPreference) findPreference("ChimeOn15Past");
        mOn30Past = (CheckBoxPreference) findPreference("ChimeOn30Past");
        mOn45Past = (CheckBoxPreference) findPreference("ChimeOn45Past");
    
        final Preference chimeMaster = findPreference("ChimeMaster");
        chimeMaster.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
            @Override
            public boolean onPreferenceChange(Preference preference, Object newVal) {
                final boolean value = (Boolean) newVal;
                mOn15Past.setChecked(value);
                mOn30Past.setChecked(value);
                mOn45Past.setChecked(value);
                return true;
            }
    
        });
    }
    

    In short, PreferenceActivity is not designed to refresh its values from the persistent storage once it is started. Instead of using SharedPreferences.Editor to modify and commit additional changes like you did in your code, it is better to make the changes into the local PreferenceManager object which will be committed by the PreferenceActivity in its normal lifecycle.