The previous article describes the various controls in PreferenceFragment, and then adds listener events for each control. . . .
It mainly implements three interfaces OnPreferenceClickListener, OnSharedPreferenceChangeListener and OnPreferenceChangeListener.
onPreferenceClick is the click event, which will be triggered when the Preference control is clicked. However, this method will not be called when the content of EditTextPreference is modified and confirmed again. To solve this problem, onSharedPreferenceChanged comes on stage. This method is triggered when the content of the Preference control changes. Finally, the onPreferenceChange method is used for MultiSelectList and Ringtone calls.
The details are directly on the code, so it is more clear. . .
public class SettingFragment extends PreferenceFragment implements Preference.OnPreferenceClickListener, SharedPreferences.OnSharedPreferenceChangeListener,Preference.OnPreferenceChangeListener { private CheckBoxPreference checkbox; private EditTextPreference edittext; private MultiSelectListPreference MultiSelectList; private ListPreference list; private RingtonePreference Ringtone; private SwitchPreference Switch; private Preference preference; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate (savedInstanceState); addPreferencesFromResource(R.xml.setting); // Find the control based on the key value checkbox = (CheckBoxPreference) findPreference("checkbox"); edittext = (EditTextPreference) findPreference("edittext"); MultiSelectList = (MultiSelectListPreference)findPreference("MultiSelectList"); list = (ListPreference)findPreference("list"); Ringtone = (RingtonePreference) findPreference("Ringtone"); Switch = (SwitchPreference) findPreference("switch"); // set the listener checkbox.setOnPreferenceClickListener(this); edittext.setOnPreferenceClickListener(this); Ringtone.setOnPreferenceClickListener(this); MultiSelectList.setOnPreferenceChangeListener(this); Ringtone.setOnPreferenceChangeListener(this); // Get our object that stores the Preferences value and act on it accordingly SharedPreferences shp = PreferenceManager.getDefaultSharedPreferences(this.getActivity()); boolean apply_Checked = shp.getBoolean("checkbox", false); // get history settings SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this.getActivity()); edittext.setSummary(sp.getString("edittext", "")); } @Override // trigger on click event public boolean onPreferenceClick(Preference preference) { // operate on the control if (preference == checkbox) { Toast.makeText(this.getActivity(), " 点击了checkbox :" + checkbox.isChecked(), Toast.LENGTH_SHORT).show(); } else if (preference == edittext) { edittext.setText(""); Toast.makeText(this.getActivity(), " 点击了edittext :" + edittext.getText(), Toast.LENGTH_SHORT).show(); } else if (preference == Ringtone) { Toast.makeText(this.getActivity(), " 点击了Ringtone :" + Ringtone.getRingtoneType(), Toast.LENGTH_SHORT).show(); } return true; } //Called when Preference changes @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { if (key.equals("edittext")) { edittext.setSummary(edittext.getText()); } if (key.equals("list")) { list.setSummary(list.getValue()); } if(key.equals("Ringtone")){ Ringtone.setSummary(Ringtone.getRingtoneType()); } if(key.equals("switch")){ Switch.setSummary(String.valueOf(Switch.isChecked())); } } @Override public void onResume() { super.onResume(); //Registration issue getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); } @Override public void onPause() { //logout event getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this); super.onPause(); } @Override public boolean onPreferenceChange(Preference preference, Object newValue) { if (preference == MultiSelectList) { MultiSelectList.setSummary(newValue.toString()); return true; } if (preference == Ringtone) { Ringtone.setSummary(newValue.toString()); return true; } return false; } }Source code click here