Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to listen for preference changes within a PreferenceFragment?

As described here, I am subclassing PreferenceFragment and displaying it inside an Activity. That document explains how to listen for preference changes here, but only if you subclass PreferenceActivity. Since I'm not doing that, how do I listen for preference changes?

I've tried implementing OnSharedPreferenceChangeListener in my PreferenceFragment but it does not seem to work (onSharedPreferenceChanged never seems to get called).

This is my code so far:

SettingsActivity.java

public class SettingsActivity extends Activity {     @Override     protected void onCreate(Bundle savedInstanceState)     {         super.onCreate(savedInstanceState);          // Display the fragment as the main content.         getFragmentManager().beginTransaction().replace(android.R.id.content, new SettingsFragment()).commit();     } } 

SettingsFragment.java

public class SettingsFragment extends PreferenceFragment implements OnSharedPreferenceChangeListener {     public static final String KEY_PREF_EXERCISES = "pref_number_of_exercises";      @Override     public void onCreate(Bundle savedInstanceState)     {         super.onCreate(savedInstanceState);          // Load the preferences from an XML resource         addPreferencesFromResource(R.xml.preferences);     }      @Override     public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)     {         //IT NEVER GETS IN HERE!         if (key.equals(KEY_PREF_EXERCISES))         {             // Set summary to be the user-description for the selected value             Preference exercisesPref = findPreference(key);             exercisesPref.setSummary(sharedPreferences.getString(key, ""));         }     } } 

preferences.xml

<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >      <EditTextPreference         android:defaultValue="15"         android:enabled="true"         android:key="pref_number_of_exercises"         android:numeric="integer"         android:title="Number of exercises" />  </PreferenceScreen> 

Also, is the PreferenceFragment even the right place to listen for preference changes or should I do it within the Activity?

like image 665
XåpplI'-I0llwlg'I - Avatar asked Nov 28 '12 01:11

XåpplI'-I0llwlg'I -


1 Answers

I believe you just need to register/unregister the Listener in your PreferenceFragment and it will work.

@Override public void onResume() {     super.onResume();     getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);  }  @Override public void onPause() {     getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);     super.onPause(); } 

Depending on what you want to do you may not need to use a listener. Changes to the preferences are committed to SharedPreferences automatically.

like image 54
antew Avatar answered Oct 20 '22 06:10

antew