2011-10-07 81 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; 
    } 
} 
相关问题