2010-02-10 4 views
5

so che posso fare qualcosa di simile:OnPreferenceChangeListener per ogni impostazione

Preference pref = findPreference(getString(R.string.pref_vibrate_on_key)); 
pref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { 

     @Override 
     public boolean onPreferenceChange(Preference preference, 
       Object newValue) { 
      LogUtil.d("Working!"); 
      return true; 
     } 

}); 

Ma vorrei aggiungere un listener per tutti i gusti. Ho provato a fare:

SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); 
sp.registerOnSharedPreferenceChangeListener(new OnSharedPreferenceChangeListener() { 

     @Override 
     public void onSharedPreferenceChanged(
       SharedPreferences sharedPreferences, String key) { 
      LogUtil.d("working!"); 

     } 

}); 

ma non funziona. È possibile? In tal caso, cosa sto sbagliando?

+0

[qui] (http://stackoverflow.com/questions/2542938/sharedpreferences-onsharedpreferencechangelistener-not-being -confermato-costantemente) è ciò che stavi facendo di sbagliato - giusto? –

risposta

1

Penso che onSharedPrefererenceChanged venga attivato al salvataggio della preferenza (quando si fa clic su BACK o HOME in PreferenceActivity). Penso che il modo più semplice sia creare una classe singola implementando OnPreferenceChangeListener e passare attraverso Preference.getKey(); e impostarla come OnPreferenceChangeListener per ogni preferenza.

+0

'onSharedPreferenceChanged' non viene richiamato su BACK/HOME. (o anche lasciando l'attività) –

+0

http://developer.android.com/guide/topics/ui/settings.html#Listening descrive questo approccio. @YoushaAleayoub sei sicuro che il listener sia ancora registrato dopo launchig PreferenceActivity e che sia registrato alle stesse SharedPreferences? – skyman

6

Supponendo che si desidera lo stesso listener chiamato di volta in volta, questa potrebbe essere una soluzione più semplice:

Preference.OnPreferenceChangeListener changeListener = new Preference.OnPreferenceChangeListener() { 
    public boolean onPreferenceChange(Preference preference, Object newValue) { 
     // Code goes here    
     return true; 
    } 
}; 

EditTextPreference pref = (EditTextPreference)findPreference(getString(R.string.pref1)); 
pref1.setOnPreferenceChangeListener(changeListener); 

EditTextPreference pref2 = (EditTextPreference)findPreference(getString(R.string.pref2)); 
pref2.setOnPreferenceChangeListener(changeListener); 
+0

non funziona con la libreria delle preferenze di supporto – user25