Общие предпочтения всегда возвращают значение по умолчанию
Вот код, который я использую, чтобы создать и сохранить значение в Preference.
outgoing - переменная String.
SharedPreferences sp = getSharedPreferences(outgoing, Activity.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.putString("PhoneNo","Hi");
editor.commit();
Вот код для получения значения из SharedPreference.
SharedPreferences sp
=getSharedPreferences(outgoing,Activity.MODE_PRIVATE);
String calln = sp.getString("PhoneNo","0");
Toast.makeText(mContext, "SHARED"+calln,Toast.LENGTH_LONG).show();
Ответы
Ответ 1
Вероятно, вы должны вызвать getSharedPreferences
в контексте, из которого вы обращаетесь к ним.
Источник
Следовательно, в зависимости от того, как вы можете получить доступ к своему контексту, если вы передаете его другому действию или асинхронной задаче, вот несколько примеров использования:
this.getSharedPreferences(outgoing, Activity.MODE_PRIVATE);
context.getSharedPreferences(outgoing, Activity.MODE_PRIVATE);
getApplicationContext().getSharedPreferences(outgoing, Activity.MODE_PRIVATE);
Кроме того, одним из способов проверки ваших вещей является использование слушателя при изменении SharedPreferences
:
onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)
Called when a shared preference is changed, added, or removed.
вот как это сделать
Вы также можете использовать Preference Manager
для получения SharedPreferences
:
PreferenceManager.getSharedPreferences(YOUR_CONTEXT).getString(
"PhoneNo", "0");
Или сохранить их:
PreferenceManager.getSharedPreferences(YOUR_CONTEXT).edit().putString(
"PhoneNo", "Hi").commit();
Ответ 2
измените этот Activity.MODE_PRIVATE
на этот Activity.MODE_MULTI_PROCESS
, проблема, вероятно, связана с другим контекстом во время хранения значения и доступа к значению.
Ответ 3
При установке значений попробуйте изменить это:
SharedPreferences sp = getSharedPreferences(outgoing, Activity.MODE_PRIVATE);
:
SharedPreferences sp = getApplicationContext().getSharedPreferences(outgoing, Activity.MODE_PRIVATE);
То же самое при получении значений - не забудьте добавить getApplicationContext()
в ваш вызов SharedPreferences
EDIT:
Убедитесь, что ваша "исходящая" строка точно такая же в обеих действиях
Ответ 4
Наиболее вероятная причина, по которой Shared Preference всегда возвращает значение по умолчанию, заключается в том, что вы сохранили значение в одном файле предпочтений, а затем попытались извлечь его в другой файл настроек. Это может произойти, если вы вызываете getPreferences()
из разных действий, потому что getPreferences()
создает другой файл предпочтений, основанный на активности, в которой он создан.
Решение
Самое простое решение - всегда получать ваши общие настройки следующим образом:
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(context);
Это будет использовать один файл предпочтений для всего приложения.
Альтернативное решение
Если по какой-то причине вам нужно использовать разные файлы предпочтений, вы можете сделать
final static String PREF_FILE_1 = "pref_file_1";
...
SharedPreferences sharedPref = context.getSharedPreferences(PREF_FILE_1, Context.MODE_PRIVATE);
Просто убедитесь, что вы всегда используете правильное имя файла для настроек, которые вы пытаетесь сохранить и получить.
Локальные предпочтения
Если вам действительно нужно предпочтение для определенного действия, вы можете использовать getPreferences(Context.MODE_PRIVATE)
. Просто не ожидайте, что вы сможете получить значения из другого действия таким же образом.
См. также