Я использовал общие настройки много раз, но по какой-то причине изменения не сохраняются в новом приложении, которое я тестирую. Вот фрагмент важного кода:
SharedPreferences sp = getSharedPreferences(getString(R.string.key_preferences), MODE_PRIVATE);
Set<String> widgets = sp.getStringSet(getString(R.string.key_widgets), (new HashSet<String>()));
widgets.add(name + " " + Integer.toString(appWidgetId) + " " + address);
sp.edit().putStringSet(getString(R.string.key_widgets), widgets).commit();
Я использовал регистрацию, чтобы проверить, добавлен ли виджет в набор, но обновленный набор никогда не сохраняется. Если я изменю последнюю строку на...
sp.edit().putStringSet(getString(R.string.key_widgets), widgets).putString("testkey", "testvalue").commit();
...тогда все отлично сохранится. Что мне не хватает?
*ОБНОВЛЕНИЕ:
Я обнаружил, что это тоже работает:
SharedPreferences sp = getSharedPreferences(getString(R.string.key_preferences), MODE_PRIVATE);
Set<String> widgets = sp.getStringSet(getString(R.string.key_widgets), (new HashSet<String>()));
Set<String> newWidgets = new HashSet<String>();
for (String widget : widgets) newWidgets.add(widget);
newWidgets.add(name + " " + Integer.toString(appWidgetId) + " " + address);
sp.edit().putStringSet(getString(R.string.key_widgets), newWidgets).commit();
Возможно, я что-то пропустил в документации о необходимости создания нового объекта для редактора, чтобы сохранить префы.
*ОБНОВЛЕНИЕ 2:
Не имеет значения, создаю ли я объект редактора:
SharePreferences.Editor spe = sp.edit();
spe.putStringSet(getString(R.string.key_widgets), widgets)
spe.commit();