2017-01-19 1 views
1

У меня есть PreferenceFragment. Внутри этого фрагмента у меня есть OnSharedPreferencesChanged вроде этого:OnSharedPreferencesChanged не вызывается после изменения настроек каким-либо другим способом, кроме использования EditTextPreference

@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

Вы вызываете 'onSharedPreferenceChanged' для каждого из ваших ключей в методе onCreatePreferences()? –

ответ

1

Во-первых, изменение итогов никогда не вызовет прослушиватель onPreferenceChanged, поскольку предпочтение не изменилось. Просто графическое представление. Фактическое предпочтение - это только пара ключ-> значение.

Во-вторых, вам нужно позвонить хотя бы с фиксацией, если не применить, для вызова вызываемого слушателя. До тех пор вы планируете изменить настройку, но на самом деле вы ее не изменили до тех пор, пока не будет вызван запрос/commit.

+0

Я использую .apply() но .commit() не работает. Я изменяю эти пары ключ-значение, как вы сказали, но «OnSharedPreferencesChanged» не вызывается для изменения своего графического представления, и я пытаюсь понять, почему. – dddeee

Смежные вопросы