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:
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);
}
}
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"));
}
}
}
<?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>
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