У меня проблема с 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);
}
}
}
Я удалил незарегистрированный звонок, но он все еще не работает. – CubeX2
Пробовал ли вы положить точку прерывания в свой метод onSharedPreferenceChanged с самого начала и проверить, что ti называется 1-й раз и не получает вызов во второй раз? –
Я сделал это. Он называется первым, но не во второй раз. Другие предпочтения, например, предпочтения в списке, похоже, просто отлично работают, если добавить их одинаково. – CubeX2