Search code examples
androidandroid-fragmentsandroid-preferencespreferenceactivity

android restore application's default preferences


I'm developing an android app which has some settings. It is still a draft, but I encountered a problem which I just don't succeed to solve: I created a sample settings activity (using the PreferenceFragment as suggested by the android developer's guide), and I added a "restore default settings" button. However, this button only partially works - it restores only the edit text preference, but not the rest. My intent is that when I press the button all of the preferences should be restored to the values that appear in the preferences.xml file.

here's the code:

Main Activity

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        PreferenceManager.setDefaultValues(this, R.xml.preferences, false);
    }

    public void applyCoF(View view) {
    }

    public void changeSettings(View view) {
        Intent settingsIntent = new Intent(this, SettingsActivity.class);
        startActivity(settingsIntent);
    }
}

Settings Activity

public class SettingsActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getFragmentManager().beginTransaction().replace(android.R.id.content, new SettingsFragment()).commit();

    }


    public static class SettingsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener {

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.preferences);
            getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);

            Preference button = findPreference(getString(R.string.restoreDefaultSettingsButton));
            button.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
                @Override
                public boolean onPreferenceClick(Preference preference) {
                    //code for what you want it to do
                    DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            switch (which) {
                                case DialogInterface.BUTTON_POSITIVE:
                                    //Yes button clicked
                                    restoreDefaultSettings();
                                    break;

                                case DialogInterface.BUTTON_NEGATIVE:
                                    //No button clicked
                                    break;
                            }
                        }
                    };

                    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
                    builder.setTitle(R.string.restoreDefaultSettingsDialogTitle);
                    builder.setMessage(R.string.restoreDefaultSettingsDialogText).
                            setPositiveButton("Yes", dialogClickListener).
                            setNegativeButton("No", dialogClickListener).
                            show();
                    return true;
                }
            });
        }

        private void restoreDefaultSettings() {
            SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
            SharedPreferences.Editor editor = preferences.edit();
            editor.clear();
            editor.apply();
            PreferenceManager.setDefaultValues(getActivity(), R.xml.preferences, true);
        }

        @Override
        public void onResume() {
            super.onResume();
            for (int i = 0; i < getPreferenceScreen().getPreferenceCount(); ++i) {
                Preference preference = getPreferenceScreen().getPreference(i);
                if (preference instanceof PreferenceGroup) {
                    PreferenceGroup preferenceGroup = (PreferenceGroup) preference;
                    for (int j = 0; j < preferenceGroup.getPreferenceCount(); ++j) {
                        Preference singlePref = preferenceGroup.getPreference(j);
                        updatePreference(singlePref, singlePref.getKey());
                    }
                } else {
                    updatePreference(preference, preference.getKey());
                }
            }
        }

        @Override
        public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
            updatePreference(findPreference(key), key);
        }

        private void updatePreference(Preference preference, String key) {
            if (preference == null || preference instanceof CheckBoxPreference) {
                return;
            }
            if (preference instanceof ListPreference) {
                ListPreference listPreference = (ListPreference) preference;
                listPreference.setSummary(listPreference.getEntry());
                return;
            }

            SharedPreferences sharedPrefs = getPreferenceManager().getSharedPreferences();
            preference.setSummary(sharedPrefs.getString(key, "Default"));
        }
    }
}

preferences.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">


    <CheckBoxPreference
        android:defaultValue="true"
        android:key="check_box_preference_1"
        android:title="Check box preference"/>
    <EditTextPreference
        android:defaultValue="DEFAULT EDIT TEXT"
        android:key="edit_text_preference_1"
        android:selectAllOnFocus="true"
        android:singleLine="true"
        android:title="Edit text preference"/>
    <ListPreference
        android:defaultValue="DEFAULT LIST"
        android:entries="@array/list_preference_entry_values"
        android:entryValues="@array/list_preference_entries"
        android:key="list_preference_1"
        android:title="List preference"/>

    <Preference android:title="Restore default values"
                android:summary=""
                android:key="@string/restoreDefaultSettingsButton"/>
</PreferenceScreen>

Solution

  • I had a similar problem - my EditTextPreferences changes, but when I clicked them it showed old value. When I closed preferences screen and go back everything was fine.

    I resolved this problem, and verified that other preferences works the same but you see it in different way. F.E. CheckBoxPreference restored to default is restored when you reaopen preferences screen. But it doesn't work after clicking "restore defaults" because it doesn't refresh preference screen in your code.

    I simply modified it to:

     private void restoreDefaultSettings() {
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
        SharedPreferences.Editor editor = preferences.edit();
        editor.clear();
        editor.apply();
        PreferenceManager.setDefaultValues(getActivity(), R.xml.pref, true);
        getPreferenceScreen().removeAll();
        onCreatePreferences(null,null); //or onCreate(null) in your code
    }
    

    I don't know that it's the best solution, but it works