59

Tengo una clase que amplía PreferenceActivity y muestra la pantalla de preferencias de mi aplicación. ¿Es posible verificar si se hicieron cambios a las preferencias?¿Cómo detectar si se realizaron cambios en las preferencias?

Esto ayuda ...

http://developer.android.com/reference/android/content/SharedPreferences.OnSharedPreferenceChangeListener.html

Otros entrada relacionada: SharedPreferences.onSharedPreferenceChangeListener not being called consistently


public class PreferenceClass extends PreferenceActivity { 

    OnSharedPreferenceChangeListener listener; 

    public void onCreate(Bundle savedInstanceState) { 
     SharedPreferences prefs = this.getSharedPreferences("settings", 0); 
     listener = new SharedPreferences.OnSharedPreferenceChangeListener() { 

      public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { 
       int flag = 1; 
      } 
     }; 
     prefs.registerOnSharedPreferenceChangeListener(listener); 
     super.onCreate(null); 
     addPreferencesFromResource(R.xml.settings); 
    } 
} 
+0

veo demasiadas direcciones esto podría ir en función de su objetivo general. ¿Podría arrojar algunos detalles sobre cuándo está revisando y con qué fin? –

+0

@RHughes Solo quiero que cada vez que se hace un cambio para hacer algo ... Acabo de encontrar este enlace http: //stackoverflow.com/questions/2542938/sharedpreferences-onsharedpreferencechangelistener-not-being-called-consistently ... Todavía no puedo conseguir para que funcione ... el método en el oyente nunca se llama ... ¿Alguna idea? – mixkat

+0

Sin mirar el código, solo puedo adivinar que estás cometiendo el mismo error que siempre hago. Construyo un gran oyente y luego olvido adjuntarlo al objeto correcto. Además, asegúrese de conectar el oyente al objeto en el método onCreate() o al menos en el código que ejecuta ANTES de que realmente necesite que el oyente esté escuchando. –

Respuesta

49

Haz

SharedPreferences.OnSharedPreferenceChangeListener spChanged = new 
          SharedPreferences.OnSharedPreferenceChangeListener() { 
      @Override 
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, 
      String key) { 
     // your stuff here 
    } 
}; 

En su PreferenceActivity, es decir, hágalo miembro de su clase PreferenceActivity y luego haga registerOnSharedPreferenceChangeListener(spChanged) en el método PreferenceActivity.onCreate().

Eso es lo que hago y nunca tengo un problema.

De lo contrario, es su comprobación condicional en el oyente el que tiene la culpa. Publica el código.

EDIT:

Desde el código que envió, debe hacer prefs una variable miembro de la clase por lo que tiene un alcance global.

Y haga prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); en lugar de getSharedPreferences porque no ha creado ese archivo.

Para crear un archivo necesita usar PreferenceManager. Para obtener un PreferenceManager, use Activity.getPreferenceManager().

+0

@sugarynugs Eso es exactamente lo que estoy haciendo ... en He copiado el código de esta otra publicación ... – mixkat

+0

@sugarynugs listener = new SharedPreferences.OnSharedPreferenceChangeListener() { public void onSharedPreferenceChanged (SharedPreferences prefs, String key) { // Implementación } }); prefs.registerOnSharedPreferenceChangeListener (listener) – mixkat

+1

@sugarynugs listener es una variable de instancia de esta clase ... solo para evitar que sea gc .. – mixkat

56

En su clase PreferenceActivity, implemente la interfaz SharedPreferences.OnSharedPreferenceChangeListener. Agregue el método onSharedPreferenceChanged requerido a su clase y regístrelo en el onCreate.

Ver código de ejemplo aquí:

public class MyPreferences extends PreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.xml.fw_preferences); //deprecated 
     PreferenceManager.getDefaultSharedPreferences(this).registerOnSharedPreferenceChangeListener(this); 
    } 

    @Override 
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { 
     // handle the preference change here 
    } 

} 
+1

¿Cómo podría refactorizar la línea obsoleta que tiene en su código? 'addPreferencesFromResource (R.xml.fw_preferences); // obsoleto' – mattecalcio

+1

@mattecalcio Sé que llego tarde, pero esta es la nueva forma de cargar un xml de configuración: http://stackoverflow.com/a/13441715/1318194 – stackunderflow

+2

¿Es una buena práctica hacer unregisterOnSharedPreferenceChangeListener (esto) en onDestroy() de MainActivity? – tieorange

2

A partir de los documentos oficiales:

Reading Preferences> Para escuchar a la preferencia cambia

Cuestiones relacionadas