如何获取传递给onSharedPreferenceChanged的键的值

时间:2015-01-04 03:11:09

标签: android sharedpreferences

在我的PreferenceFragment中,我实现了一个OnSharedPreferenceChanged侦听器。有用。我能够在Log.i中看到“key”与我正在修改的属性(切换首选项)匹配。

但我无法确定的是如何获得密钥的“价值”?我一直在努力解决这个问题大约一天半,我知道这一定是可能的。

public class PrefsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.preferences);
    // set all text correctly
    onSharedPreferenceChanged(null, "");
}

@Override
public void onResume() {
    super.onResume();
    getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
}

@Override
public void onPause() {
    getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
    super.onPause();
}

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

    Preference preference = findPreference(key);

    Log.i("TAG", String.valueOf(key));
}

}

4 个答案:

答案 0 :(得分:2)

您需要使用sharedPreferences属性来获取密钥的值。

    public class PrefsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.preferences);
    // set all text correctly
    onSharedPreferenceChanged(null, "");
}

@Override
public void onResume() {
    super.onResume();
    getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
}

@Override
public void onPause() {
    getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
    super.onPause();
}

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

    String value = sharedPreferences.getString(key, "");

    Log.i("TAG", value);
}

}

getString()的第二个参数是默认值,如果该方法没有找到该键的任何内容(不要返回null)

您必须确保首选项中存储的类型与您恢复的类型相对应(在本例中为String)。在其他情况下,您需要使用getInt()或getFloat()...

答案 1 :(得分:0)

我就像在程序的其他地方一样:

if (key.equals("save_login")) {
boolean saveLogin = AppObject.defaultPrefs.getBoolean("save_login", true);
    if(!saveLogin) {
        // clear login info that may already have been saved, by default 'true'
        SharedPreferences.Editor ed = AppObject.defaultPrefs.edit();
        ed.putString("username", "");
        ed.putString("password", "");
        ed.commit();
    }
}

答案 2 :(得分:0)

if ("my_switch_preference_key".equals(key)) {
  boolean newValue = sharedPreferences.getBoolean(key, false);

  // use the new value
}

"my_switch_preference_key"替换为实际的切换首选项键。

答案 3 :(得分:0)

它有点晚了,但我认为我们不必if-else通过以下代码获取密钥的值:

@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
    Map<String, ?> all = sharedPreferences.getAll();
    Object value = all.get(key);
    Log.d("TAG", "Key is: " + key);
    Log.d("TAG", "Value is: " + String.valueOf(value));
}

您获得了密钥的Object值。