在使用EditTextPreference之外的任何其他方法更改首选项后,不会调用OnSharedPreferencesChanged

时间:2017-01-19 19:38:56

标签: android sharedpreferences android-preferences

我有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方法并更新摘要吗?

1 个答案:

答案 0 :(得分:1)

首先,更改摘要将不会调用onPreferenceChanged侦听器,因为首选项没有更改。只是图形表示。实际的偏好只是key->值对。

其次,你需要调用至少commit,如果不适用,才能调用监听器。在此之前,您计划更改设置,但在调用apply / commit之前,您实际上没有更改过它。