Общие предпочтения всегда возвращают значение по умолчанию

Вот код, который я использую, чтобы создать и сохранить значение в 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). Просто не ожидайте, что вы сможете получить значения из другого действия таким же образом.

См. также