我有PreferenceFragment
。在这个片段中,我有OnSharedPreferencesChanged
这样:
@Override
public void onSharedPreferenceChanged(SharedPreferences preference, String key) {
Preference pref = findPreference(key);
pref.setSummary(preference.getString(key, ""));
}
我这样绑定listener
:
@Override
public void onResume(){
super.onResume();
getPreferenceManager().getSharedPreferences()
.registerOnSharedPreferenceChangeListener(this);
}
@Override
public void onPause() {
super.onPause();
getPreferenceManager().getSharedPreferences()
.unregisterOnSharedPreferenceChangeListener(this);
}
当我更改某些数据时,只需在EditTextPrefence
中输入数据,它就会按预期更改。但我希望有不同的方法可以改变我的偏好,只需输入它。我正在努力处理地理坐标,因此我想使用PlacePicker
更改给定项目的纬度和经度。
以下是我的代码片段,用于检索从PlacePicker
中选择的位置:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Place place = getPlace(getActivity(), data);
LatLng latLng = place.getLatLng();
double latitude = latLng.latitude;
double longitude = latLng.longitude;
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
Preference longitudePreference = findPreference(getResources().getString(R.string.pref_car_longitude_key));
longitudePreference.setSummary(String.valueOf(longitude));
Preference latitudePreference = findPreference(getResources().getString(R.string.pref_car_latitude_key));
latitudePreference.setSummary(String.valueOf(latitude));
sharedPreferences.edit().putString(getResources()
.getString(R.string.pref_car_longitude_key), String.valueOf(longitude)).apply();
sharedPreferences.edit().putString(getResources()
.getString(R.string.pref_car_latitude_key), String.valueOf(latitude)).apply();
}
我的问题是,我必须保留这些latitudePreference.setSummary(String.valueOf(latitude));
之类的行,以便在从地图中选择地点后更新我的偏好设置屏幕,并使用sharedPreferences.edit().putString(getResources().getString(R.string.pref_car_longitude_key), String.valueOf(longitude)).apply();
这样的行来保持我的SharedPrefences
正在更新。当我删除setSummary
时,首选项屏幕上的摘要不会更新,我相信它应该因为我正在更改我的SharedPreferences。那么不应该调用OnSharedPreferencesChanged
方法并更新摘要吗?
答案 0 :(得分:1)
首先,更改摘要将不会调用onPreferenceChanged侦听器,因为首选项没有更改。只是图形表示。实际的偏好只是key->值对。
其次,你需要调用至少commit,如果不适用,才能调用监听器。在此之前,您计划更改设置,但在调用apply / commit之前,您实际上没有更改过它。