如何获取传递给 onSharedPreferenceChanged 的​​ key 的值

How to obtain the value of the key passed to onSharedPreferenceChanged

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

但是我无法确定的是如何获得密钥的'value'?我已经为此苦苦挣扎了大约一天半,我知道这是可能的。

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));
}

}

我只是像在程序的其他地方一样得到它:

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();
    }
}
if ("my_switch_preference_key".equals(key)) {
  boolean newValue = sharedPreferences.getBoolean(key, false);

  // use the new value
}

"my_switch_preference_key"替换为实际的切换偏好键。

您需要使用 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() 的第二个参数是默认值,如果该方法没有找到任何具有该键的内容(不要 returns null)

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

有点晚了,但我认为我们不必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 值。