Android: обновление SharedPrefereces при возобновлении активности не работает - PullRequest
2 голосов
/ 09 июня 2011

У меня есть "Activity A", которая читает некоторые значения из SharedPreferences и отображает их в TextView, затем я называю "Activity B", где значения из SharedPreferences обновляются и записываются обратно в SharedPreferences. Наконец, я возвращаюсь к «занятию a» нажатием кнопки «назад», теперь новые (обновленные) значения должны быть считаны из SharedPreferences и показаны в TextView. Но здесь возникает проблема, значения, только что прочитанные из SharedPreferences, все еще не обновляются (не новые, заданные действием b) (полученные из вывода logcat), как это получается? SharedPrefs нужно какое-то ручное обновление?

Если я перезапущу «Activity a», все будет работать нормально, и новые значения будут отображаться правильно. В чем дело?

Я вызываю метод для чтения и показа значений из onResume() в "Activity a".

Я также пытался создать экземпляр объекта SharedPrefs (с getSharedPreferences()), но это тоже не помогает.

Заранее спасибо!

Ответы [ 4 ]

1 голос
/ 09 июня 2011

Вы вызываете метод commit () в действии b для сохранения новых значений.

Например, что-то вроде:

SharedPreferences customSharedPreference = getSharedPreferences("abcprefs", 0);
SharedPreferences.Editor editor = customSharedPreference.edit();
editor.putString("key", "val");
editor.commit();

И, во-вторых, вы можете завершить () действие допосле отправки в действие b, затем из действия ba будет создан новый экземпляр действия a и будет вызвана onCreate ().

В качестве альтернативы вы можете обновить настройки в onStart (), поскольку ваша активность, вероятно, "нет"больше видно "при отправке на мероприятие б.

См. http://developer.android.com/guide/topics/fundamentals/activities.html, чтобы увидеть жизненный цикл действия.

1 голос
/ 09 июня 2011

SharedPreferences не для обмена данными между действиями

Используйте Intent и Activity.startActivityForResult. Смотрите мой ответ здесь Получить объект намерения в действии

0 голосов
/ 07 января 2012

Стоит также отметить, что preference.edit () каждый раз выдает другое значение SharedPreferences.Editor, поэтому важно сохранить редактор в отдельной переменной, использовать его для записи предпочтений и затем зафиксировать этот редактор. Например. это не сработает:

myPrefs.edit().putInt("pref", 1);
myPrefs.edit().putBoolean("pref", true);
myPrefs.edit().commit();

Это должно быть (как было продемонстрировано):

SharedPreferences myPrefs = getSharedPreferences("pref_name", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = myPrefs.edit();
editor.putInt("pref", 1);
editor.putBoolean("pref", true);
editor.commit();
0 голосов
/ 09 июня 2011

Убедитесь, что вы используете одни и те же настройки для каждого из ваших действий: если вы используете getSharedPreferences, вы должны указать файл и уровень доступа.В вашем случае это звучит так, как будто getDefaultSharedPreferences будет правильным.

Кроме того, убедитесь, что вы не только устанавливаете настройки, но и фиксируете изменения:

SharedPreferences preferences = getDefaultSharedPreferences(this);
SharedPreferences.Editor editor = preferences.edit();
editor.putString("key", "value");
editor.commit();

, а затем в других ваших действиях:

SharedPreferences preferences = getDefaultSharedPreferences(this);
boolean myPreference = preferences.getBoolean("key", defaultValue);

С этим было бы легче справиться, если бы вы опубликовали части кода, о которых идет речь;если вы все еще не можете заставить его работать, я бы попробовал добавить его к вашему сообщению.

...