2013-09-29 6 views
0

У меня проблема с onSharedPreferenceChanged вызывается только при первом изменении параметра MultiSelectListPreference. Я открываю активность своих настроек и изменяю значение, которое отлично работает, и вызывается вызов onSharedPreferenceChanged. Если я снова открою диалог, он отобразит правильные записи. Я выбираю другую запись и нажимаю OK. onSharedPreferenceChanged теперь должен вызываться, но это не так. Если я сейчас снова открою диалог, не будут выбраны никакие записи. Я что-то упустил или сделал что-то неправильно?onSharedPreferenceChanged не вызывается каждый раз, когда предпочтение было изменено.

Вот моего preferences.xml

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> 
    <MultiSelectListPreference 
     android:key="operations" 
     android:title="@string/pref_operations" 
     android:dialogTitle="@string/pref_operations" 
     android:entries="@array/pref_operations_entries" 
     android:entryValues="@array/pref_operations_values" 
     android:defaultValue="@array/pref_operations_default" /> 
</PreferenceScreen> 

И моя настройка фрагмент

public class SettingsFragment extends PreferenceFragment 
      implements SharedPreferences.OnSharedPreferenceChangeListener 
{  
    public static final String KEY_OPERATIONS_PREFERENCE = "operations"; 

    private MultiSelectListPreference operationsPreference; 

    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.xml.preferences); 

     operationsPreference = (MultiSelectListPreference) getPreferenceScreen().findPreference(KEY_OPERATIONS_PREFERENCE);   
    } 

    @Override 
    public void onResume() 
    { 
     super.onResume(); 

     SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity()); 

     Set<String> operations = operationsPreference.getValues(); 
     String summary = ""; 
     for (String s : operations) 
      summary += s + " "; 
     operationsPreference.setSummary(summary); 

     sharedPreferences.registerOnSharedPreferenceChangeListener(this); 
    } 

    @Override 
    public void onPause() 
    { 
     super.onPause(); 

     getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this); 
    } 

    @Override 
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) 
    { 
     if (key.equals(KEY_OPERATIONS_PREFERENCE)) 
     {    
      Set<String> operations = operationsPreference.getValues(); 
      String summary = ""; 
      for (String s : operations) 
       summary += s + " "; 
      operationsPreference.setSummary(summary); 
     }   
    } 
} 

ответ

0

Уммы откровенно я построил мой sharedPreferances иначе ... плохо прикрепить мой пример кода, и, надеюсь, это будет использование к вам здесь идет:

это общий класс ссылок

public class AppPreferences { 
     public static final String KEY_LANG = "language"; 
     final String APP_SHARED_PREFS = AppPreferences.class.getSimpleName(); // Name 
                       // of 
                       // the 
                       // file 
                       // -.xml 
     private SharedPreferences _sharedPrefs; 
     private Editor _prefsEditor; 

     public AppPreferences(Context context) { 
      this._sharedPrefs = context.getSharedPreferences(APP_SHARED_PREFS, 
        Activity.MODE_PRIVATE); 
      this._prefsEditor = _sharedPrefs.edit(); 
     } 

     public String getlanguage() { 
      return _sharedPrefs.getString(KEY_LANG, ""); 
     } 

     public void savelanguage(String text) { 
      _prefsEditor.putString(KEY_LANG, text); 
      _prefsEditor.commit(); 
     } 
    } 

использовать его вы будете должны создать в классе

private AppPreferences _appPrefs; 

и примером для использования является

_appPrefs = new AppPreferences(getApplicationContext()); 
      _appPrefs.savelanguage("English"); 
language = _appPrefs.getlanguage(); 

это, как я построил его ... работает как шарм. .. и совсем не сложно

0

Это потому, что вы отменили регистрацию слушателя в методе обратного вызова onPause, который вызывается, когда Dialog отображается в Activity.

+0

Я удалил незарегистрированный звонок, но он все еще не работает. – CubeX2

+0

Пробовал ли вы положить точку прерывания в свой метод onSharedPreferenceChanged с самого начала и проверить, что ti называется 1-й раз и не получает вызов во второй раз? –

+0

Я сделал это. Он называется первым, но не во второй раз. Другие предпочтения, например, предпочтения в списке, похоже, просто отлично работают, если добавить их одинаково. – CubeX2

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