2011-10-07 25 views
5

Jestem nowy w rozwoju Androida. W mojej aplikacji, gdy użytkownik zmienia preferencję, należy wywołać funkcję, aby zaktualizować niektóre zmienne.Jak wywołać funkcję * po * onPreferenceChange?

To jest mój bieżący kod:

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

     ... 

     updateVariables(); 
     return true; 
    } 
}); 

Problem polega na tym, że gdy updateVariables() nazywa, wartość preferencji nie jest jeszcze zaktualizowane, a funkcja widzi starą wartość.

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

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

Jakie jest rozwiązanie najmniej inwazyjne? Dzięki!

Odpowiedz

4

Drugi argument z onPreferenceChange()(arg1 tutaj) to nowa wartość. Proponuję po prostu dodać to jako argument do updateVariables() i po prostu przekazać obiekt do pracy z nim.

+0

dzięki. Ale co jeśli w 'updateVariables()' muszę iterować wiele innych preferencji? Potrzebowałbym wielu różnych argumentów. – danieleds

+0

To tutaj po prostu podaje jedną zmienioną wartość preferencji. Wszystkie pozostałe są takie same, dopóki nie zostanie zwrócone wywołanie zwrotne. Musisz tylko przesłać dalej, wszystkie pozostałe można odczytać, tworząc normalny obiekt 'SharedPreferences'. * (Poza tym możesz nadal używać 'List' jako argumentu, jeśli masz dużo argumentów do przekazania) * –

+0

hmm ... może robię to źle, ale dodałem przykład' updateVariables() '. Jak mogę zrobić cykl, jeśli dodaję dodatkowy argument ze zaktualizowaną wartością? Jak mogę uniknąć przetwarzania tych samych preferencji 2 razy (jeden raz ze starą wartością z SharedPreferences, raz z nową wartością z args)? Mogę myśleć tylko o brudnych rozwiązaniach: S – danieleds

0

Korzystanie 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; 
    } 
} 
Powiązane problemy