¿Cómo escuchar los cambios de preferencia dentro de un archivo PreferenceFragment?

Como se describe aquí , estoy subclase PreferenceFragment y mostrarlo dentro de una actividad. Ese documento explica cómo escuchar los cambios de preferencia aquí , pero sólo si subclases PreferenciaActividad. Como no estoy haciendo eso, ¿cómo puedo escuchar los cambios de preferencia?

He intentado implementar OnSharedPreferenceChangeListener en mi PreferenceFragment pero no parece funcionar ( onSharedPreferenceChanged nunca parece ser llamado).

Este es mi código hasta ahora:

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> 

Además, ¿el PreferenceFragment es el lugar adecuado para escuchar los cambios de preferencia o debo hacerlo dentro de la Actividad?

Creo que solo necesita registrar / anular el registro del Listener en su PreferenceFragment y funcionará.

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

Dependiendo de lo que quiera hacer, puede que no necesite usar un oyente. Los cambios en las preferencias se SharedPreferences a SharedPreferences automáticamente.

La solución de antew funciona bien, aquí puedes ver una actividad de preferencia completa para Android v11 en adelante:

 import android.app.Activity; import android.content.SharedPreferences; import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.os.Bundle; import android.preference.ListPreference; import android.preference.PreferenceFragment; public class UserPreferencesV11 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 PrefsFragment()).commit(); } public static class PrefsFragment extends PreferenceFragment implements OnSharedPreferenceChangeListener { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Load the preferences from an XML resource addPreferencesFromResource(R.xml.preferences); // set texts correctly onSharedPreferenceChanged(null, ""); } @Override public void onResume() { super.onResume(); // Set up a listener whenever a key changes getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); } @Override public void onPause() { super.onPause(); // Set up a listener whenever a key changes getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this); } @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { // just update all ListPreference lp = (ListPreference) findPreference(PREF_YOUR_KEY); lp.setSummary("dummy"); // required or will not update lp.setSummary(getString(R.string.pref_yourKey) + ": %s"); } } } 

Todas las otras respuestas son correctas. Pero me gusta más esta alternativa porque inmediatamente tienes la instancia de preferencia que causó el cambio.

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Preference pref = findPreference(getString(R.string.key_of_pref)); pref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { // do whatever you want with new value // true to update the state of the Preference with the new value // in case you want to disallow the change return false return true; } }); } 

Esto funcionó para mí de PreferenceFragment.onCreate ()

 OnSharedPreferenceChangeListener listener = new SharedPreferences.OnSharedPreferenceChangeListener() { public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { showDialog(); } }; 
  • Cómo guardar notificaciones push de analizar por SharedPreferences
  • No se puede acceder a las preferencias creadas por PreferenceActivity
  • Sharedpreference con la pantalla de bienvenida
  • SharedPreferences Borrar / Guardar
  • Recuperación de valores de prefrences compartidos en otra actividad
  • Editar las preferencias compartidas de DDMS
  • Serializar un SparseArray <T> con GSON
  • Configuración de valores predeterminados de varias instancias / archivos de SharedPreferences
  • Copia de seguridad de Android 2.2: ¿Cómo hacer copias de seguridad DefaultSharedPreferences?
  • ¿Por qué la variable estática de mi aplicación Android a veces se devuelve nula?
  • Excepción de puntero nulo de Android para las preferencias compartidas
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.