I implement a custom Preferenceone that will behave similarly to a button (preference will open a dialog to restore default values for all settings). It works great if you click on the button ResetPreferencethat displays the dialog, and if you press positively, all preference data is cleared and reset , but if you click on the button ResetPreference, nothing will happen. I believe that PreferenceScreensomething is wrong when setting the parameter to zero and re-add resources.
If you ask why I used this approach, I wanted to click on reset and immediately show the result of the change, if anyone knows the best way to implement reset, please give a small example.
PS: If you click on ResetPreferenceand select the negative button, nothing happens and the listener is still functioning, so it really needs to delete something and re-add resources.
ResetPreference.java
public class ResetPreference extends Preference {
public ResetPreference(Context context, AttributeSet attrs) {
super(context, attrs);
setOnPreferenceClickListener(new OnPreferenceClickListener() {
public boolean onPreferenceClick(Preference preference) {
AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
builder.setTitle(R.string.prefAlertDialog_Title);
builder.setMessage(R.string.prefAlertDialog_Message);
builder.setPositiveButton(R.string.prefAlertDialog_Positive, new OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
SettingsFragment.resetSettings(getContext());
}
});
builder.setNegativeButton(R.string.prefAlertDialog_Negative, null);
builder.create().show();
return false;
}
});
}}
Then there is my custom PreferenceFragment
SettingsFragment.java
public class SettingsFragment extends PreferenceFragment{
private static SettingsFragment sf = null;
public static void resetSettings(Context ctx)
{
PreferenceManager
.getDefaultSharedPreferences(ctx)
.edit()
.clear()
.commit();
PreferenceManager.setDefaultValues(ctx, R.xml.preferences, true);
if(sf != null)
{
sf.setPreferenceScreen(null);
sf.addPreferencesFromResource(R.xml.preferences);
}
}
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sf = this;
addPreferencesFromResource(R.xml.preferences);
Preference reset = (Preference) findPreference("reset");
reset.setOnPreferenceClickListener(new OnPreferenceClickListener()
{
public boolean onPreferenceClick(Preference pref)
{
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle(R.string.prefAlertDialog_Title);
builder.setMessage(R.string.prefAlertDialog_Message);
builder.setPositiveButton(R.string.prefAlertDialog_Positive, new OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
PreferenceManager
.getDefaultSharedPreferences(getActivity().getApplicationContext())
.edit()
.clear()
.commit();
PreferenceManager.setDefaultValues(getActivity().getApplicationContext(), R.xml.preferences, true);
setPreferenceScreen(null);
addPreferencesFromResource(R.xml.preferences);
}
});
builder.setNegativeButton(R.string.prefAlertDialog_Negative, null);
builder.create().show();
return true;
}
});
}
@Override
public void onStop() {
super.onStop();
sf = null;
}}
After you add the sentence, https://stackoverflow.com/a/166708/270770 ... everything is done in SettingsFragment. ResetPreferenceno longer needed, and standard android can be used instead Preference.
The only code needed to implement the reset button is in this updated
SettingsFragment.java
public class SettingsFragment extends PreferenceFragment{
private void addMyResetListener() {
Preference reset = (Preference) findPreference("reset");
reset.setOnPreferenceClickListener(new OnPreferenceClickListener()
{
public boolean onPreferenceClick(Preference pref)
{
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle(R.string.prefAlertDialog_Title);
builder.setMessage(R.string.prefAlertDialog_Message);
builder.setPositiveButton(R.string.prefAlertDialog_Positive, new OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
resetSettings(SettingsFragment.this.getActivity());
}
});
builder.setNegativeButton(R.string.prefAlertDialog_Negative, null);
builder.create().show();
return true;
}
});
}
public void resetSettings(Context ctx)
{
PreferenceManager
.getDefaultSharedPreferences(ctx)
.edit()
.clear()
.commit();
PreferenceManager.setDefaultValues(ctx, R.xml.preferences, true);
setPreferenceScreen(null);
addPreferencesFromResource(R.xml.preferences);
addMyResetListener();
}
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
addMyResetListener();
} }