2011-10-07 15 views
5

Soy nuevo en el desarrollo de Android. En mi aplicación, cuando un usuario cambia una preferencia, se debe llamar a una función para actualizar algunas variables.¿Cómo llamar a una función * después de * onPreferenceChange?

Este es mi código actual:

mypref.setOnPreferenceChangeListener(
    new OnPreferenceChangeListener() { 
     public boolean onPreferenceChange(Preference arg0, Object arg1) { 
     if(arg1.toString().matches("...") == false) { 
      ... 
      return false; 
     } 

     ... 

     updateVariables(); 
     return true; 
    } 
}); 

El problema es que cuando se llama updateVariables(), el valor de preferencia aún no está actualizada y la función ve el valor antiguo.

private void updateVariables() 
{ 
    SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this); 
    Map<String, ?> savedKeys = sharedPref.getAll(); 

    for (Map.Entry<String, ?> entry : savedKeys.entrySet()) { 
     // for each preference... 
    } 
} 

¿Cuál sería la solución menos invasiva? ¡Gracias!

Respuesta

4

El segundo argumento de onPreferenceChange()(arg1 aquí) es el nuevo valor. Sugeriría simplemente agregar eso como argumento al updateVariables() y pasar el objeto para trabajar con él.

+0

Gracias. Pero ¿y si en 'updateVariables()' tengo que repetir muchas otras preferencias? Necesitaría muchos argumentos diferentes. – danieleds

+0

Esto aquí solo le da el valor de preferencia que cambió. Todos los demás son iguales hasta que devuelva la devolución de llamada. De modo que solo tiene que reenviar el uno, todos los demás se pueden leer creando un objeto 'SharedPreferences' normal. * (Aparte de eso, puedes usar una 'Lista' como argumento si tienes muchos argumentos para proporcionar) * –

+0

hmm ... tal vez lo estoy haciendo mal, pero he agregado un ejemplo de 'updateVariables() '. ¿Cómo puedo hacer el ciclo si agrego un argumento adicional con el valor actualizado? ¿Cómo puedo evitar procesar la misma preferencia 2 veces (una vez con el valor anterior de SharedPreferences, una vez con el nuevo valor de args)? Solo puedo pensar en soluciones sucias: S – danieleds

0

Usando PreferenceFragmentCompat

public class FragmentSettings 
extends PreferenceFragmentCompat 
implements SharedPreferences.OnSharedPreferenceChangeListener 


@Override 
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { 

    addPreferencesFromResource(R.xml.app_preferences); 

    getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); 
} 


@Override 
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { 

    switch(key) 
    { 
     case "KEY1": 
      // DO STUFF 
      break; 

     case "KEY2": 
      // DO STUFF 
      break; 
    } 
} 
Cuestiones relacionadas