2011-10-07 45 views
5

我是Android開發新手。 在我的應用程序中,當用戶更改首選項時,應該調用一個函數來更新某些變量。如何在* onPreferenceChange之後調用函數*

這是我當前的代碼:

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

     ... 

     updateVariables(); 
     return true; 
    } 
}); 

的問題是,當updateVariables()被調用時,優先值尚未更新,功能看到舊值。

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

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

什麼是最不具侵略性的解決方案?謝謝!

回答

4

onPreferenceChange()arg1 here)的第二個參數是新值。我建議只是將其作爲參數添加到updateVariables(),並且僅傳遞該對象來處理它。

+0

感謝。但是如果在'updateVariables()'我必須迭代許多其他首選項呢?我需要很多不同的論點。 – danieleds

+0

這裏只是給你一個改變了的偏好值。所有其他人都是一樣的,直到回調回來。所以你只需要轉發一個,所有其他的可以通過創建一個普通的'SharedPreferences'對象來讀取。 *(除此之外,如果您提供了很多參數,仍然可以使用'List'作爲參數)* – 2011-10-08 09:13:27

+0

嗯......也許我做錯了,但我添加了一個'updateVariables ()'。 如何使用更新後的值添加額外參數,如何進行循環?我如何避免處理相同的首選項2次(一次使用來自SharedPreferences的舊值,一次使用來自參數的新值)? 我只能想到骯髒的解決方案:S – danieleds

0

使用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; 
    } 
} 
相關問題