Android 如何获取传递给onSharedPreferenceChanged的密钥的值

Android 如何获取传递给onSharedPreferenceChanged的密钥的值,android,sharedpreferences,Android,Sharedpreferences,在我的PreferenceFragment中,我实现了一个OnSharedPreferenceChanged侦听器。它起作用了。我可以在日志中看到“键”与我正在修改的属性(开关首选项)匹配 但我无法确定的是,我如何才能获得密钥的“值”?我已经为此挣扎了一天半,我知道这是可能的 public class PrefsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeList

在我的PreferenceFragment中,我实现了一个OnSharedPreferenceChanged侦听器。它起作用了。我可以在日志中看到“键”与我正在修改的属性(开关首选项)匹配

但我无法确定的是,我如何才能获得密钥的“值”?我已经为此挣扎了一天半,我知道这是可能的

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

用实际的开关首选项键替换
“我的开关首选项键”

您需要使用SharedReferences属性来获取键的值

    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)


您必须确保存储在首选项中的类型与恢复的类型相对应(本例中为字符串)。在另一种情况下,您需要使用getInt()或getFloat()…

这有点晚了,但我认为我们不必使用
,否则
通过以下代码获得键的值:

@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));
}
@覆盖
已更改共享首选项上的公共void(SharedReferences SharedReferences,字符串键){
Map all=SharedReferences.getAll();
对象值=all.get(键);
Log.d(“标签”,“键为:”+键);
Log.d(“标记”,“值为:”+String.valueOf(Value));
}

您获得了键的
对象

Bro提示:代替
Log.i(“TAG”,String.valueOf(key))
您可以编写
Log.i(“TAG”,key)
Log.i(“标记”,键+”)以避免空指针异常。非常好。谢谢。赫拉斯特拉斯和尤金的回答都很有效。我只是在第一次将其标记为正确。非常感谢。
@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));
}