SharedPreferences не будет сохранять/загружать в PreferenceActivity
РЕДАКТИРОВАТЬ: Проблема, описанная ниже, объясняется очень необычной проблемой устройства, не вызванной какой-либо проблемой, связанной с кодированием.
У меня есть preActivity, в которой у меня есть много checkBoxPreferences.
Функция checkBoxPreference должна сохранять файл общих настроек по умолчанию, а затем сновазываться при открытии приложения для обновления пользовательского интерфейса.
Это не так, как предполагают.
Если я закрою приложение и откройте его, мои значения останутся такими, какими они и есть, но если я использую диспетчер задач для завершения приложения или если я включу телефон (когда приложение не будет запущено), тогда будут вызваны значения по умолчанию еще раз.
Итак, я создал SharedPreference в моем onResume(), чтобы проверить его.
SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
Затем я проверяю, есть ли ключ в этой sharedpreference.
pref.contains("myCheckBoxPreference");
Когда я закрываю и открываю его, он возвращает true. если я закрою с диспетчером задач или выключим питание, выключите и снова включите телефон, затем верните false.
Итак, я попытался вручную установить SharedPreference
SharedPreferences.Editor editor = pref.edit();
editor.putBoolean("myCheckBoxPreference", myCheckBoxPreference.isChecked());
editor.commit();
а затем я назвал это, когда значение checkboxpreference изменилось. Я также пробовал называть его onStop и onPause. Тем не менее, если я закрою приложение и откройте его обратно, pref.contains вернет true, но если я выключу и снова включу телефон, он вернет false.
Поэтому я попытался использовать файл SharedPreferences.
В объявлении класса:
public static final String PREFS = "prefs";
И в onResume():
SharedPreferences pref = this.getSharedPreferences(PREFS, 0);
То же поведение, pref.contains по-прежнему возвращает true, если я просто закрываю приложение и открываю его обратно, но он возвращает false, если я выключил и снова включил телефон.
Затем я попытался изменить значение ключа myCheckBoxPreference на то, что НЕ соответствовало xml-ключу для CheckBoxPreference, и оно все равно имело тот же эффект.
И я удалил приложение с телефона, затем выключил и снова включил телефон, а затем снова установил его, и он по-прежнему имеет тот же эффект.
Ответы
Ответ 1
Я просто решил, я уверен. Никакой ошибки кода с моей стороны, и нет никакого вопроса с моим приложением вообще (я не верю, во всяком случае.)
Я создал новый проект под названием "testproj", затем я скопировал ВСЕ код из своих настроек PreferenceActivity, вставил его в TestprojActivity, и я скопировал код из xml, на который он положил, затем вставил его в файл main.xml TestProj.
Затем я установил TestProj на Samsung Captivate, изменил настройки вокруг, очистил RAM через управление оперативной памятью (функция пользовательского ПЗУ, который у меня есть), и настройки застряли. Затем я включил питание телефона, и настройки все еще были там, как будто я их настроил.
Они остались, когда я вручную их установил, используя:
PreferenceManager.getDefaultSharedPreferences();
и без сохранения их вручную в SharedPreferences.
Так как это не мой телефон, я еще не пробовал, но я предполагаю, что Factory Data reset полностью исправит его
EDIT: Я смог протестировать как новый Samsung Captivate, так и Samsung, и он сработал.
Я потратил много времени, пытаясь понять это, и надеюсь, что это поможет кому-то другому.:)
Ответ 2
Я столкнулся с возможно подобной проблемой на Samsung Galaxy S, где разрешения для XML файла предпочтений каким-то образом изменились/повреждены.
Журнал показал, что какой-то хост-процесс не смог прочитать файл, заставив все настройки reset по умолчанию. Я не помню точного сообщения об ошибке, но оно было похоже на "разрешение отклонено для /path/to/preferences/file.xml".
Решением для меня было удаление данных приложения через "Настройки", "Приложения", "Управление приложениями", "MyApp", "Удалить данные". Это удалит файл настроек, связанный с приложением, и проблема мгновенно исчезла.
Я предположил, что это изолированное событие, поскольку я не сталкивался с ним снова на различных устройствах Android (включая Galaxy S II).
Ответ 3
На основном тестовом устройстве клиента я столкнулся с той же проблемой. Используемое устройство - Samsung Galaxy S с SDK уровня 8 (2.2.1).
Странное поведение заключается в том, что либо SharedPreferences
не сохраняются, либо, как после factory reset, они слишком постоянны, то есть они не удаляются после переустановки приложения.
Из-за текущего распространения в 2.2.x, а количество продаваемых устройств Samsung Galaxy S составляет несколько миллионов, вероятность появления этой проблемы является значительным.
Таким образом, можно считать решающим для реализации обходного пути для сохранения предпочтений.
Чтобы собрать подробные характеристики, чтобы изолировать это обходное решение с острыми краями, может ли каждый, кто также сталкивается с этой проблемой , предоставить здесь следующую версию ядра (System.getProperty("os.version"
)?
Я думал о чем-то вроде этого:
// !! I know that 2.6.32.9 is not yet correct. This would be a false positive !!
if ((System.getProperty("os.version").startsWith("2.6.32.9"))
&& (android.os.Build.DEVICE.contains("GT-I9000")))
useInternalStorage();
else
useSharedPreferences();
Я могу опубликовать реальный код здесь и после его приготовления, и кому-то это интересно.
ИЗМЕНИТЬ: дополнительную информацию:
Устройства, стоящие перед этой проблемой:
Property | Values
---------------------------------+------------------------------------
Build.DEVICE | "GT-I9000T"
Build.VERSION.INCREMENTAL | "UBJP9"
Build.VERSION.RELEASE | "2.2.1"
Build.VERSION.SDK | 8
System.getProperty("os.version") | "2.6.32.9"
Подобные устройства не сталкиваются с этой проблемой:
Property | Values
---------------------------------+------------------------------------
Build.DEVICE | "GT-I9000"
Build.VERSION.INCREMENTAL | "AOJP4"
Build.VERSION.RELEASE | "2.2"
Build.VERSION.SDK | 8
System.getProperty("os.version") | "2.6.32.9"
Ответ 4
Попробуйте очистить редактор, прежде чем устанавливать значения. У меня была такая же проблема, и это сработало для меня.
Пример:
Editor e = PreferenceManager.getDefaultSharedPreferences(getParent()).edit();
e.clear();
e.putStringSet(key, value);
Ответ 5
Можно обойти проблему разрешений с помощью sharedUserId, которая должна быть одинаковой для любого из ваших подписанных приложений.
http://developer.android.com/reference/android/R.attr.html#sharedUserId
Ответ 6
У меня тоже была проблема с сохранением и последующим извлечением данных. У меня был код сохранения и загрузки в классе, который расширяет приложение, потому что мне нужен один экземпляр моих данных. Я мог видеть, что String сохраняется, ошибок в LogCat и все же, когда я пытаюсь загрузить его, снова без ошибок, моя String пуста. Я никогда не проверял, действительно ли данные попали в файл, поэтому я понятия не имею, произошел ли сбой при сохранении или загрузке или в обоих случаях.
Мой код был более или менее следующим: (comboToSave - это просто строка, сгенерированная Gson из простого класса данных)
одним способом для сохранения:
SharedPreferences sharedPref = activity.getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString(getString(R.string.prefCombos), comboToSave);
editor.commit();
в другом методе загрузки:
SharedPreferences sharedPref = activity.getPreferences(Context.MODE_PRIVATE);
String loadedComboText = sharedPref.getString(getString(R.string.prefCombos), "");
После большого количества царапин на голове и не зная, что делать, я изменил код, который извлекает значение sharedPref из
SharedPreferences sharedPref = activity.getPreferences(Context.MODE_PRIVATE);
к
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
Здесь есть еще о различии между ними (хотя в моем случае это выглядит точно так же)
И все же результат на моей Галактике S3 был таким же. Однако тестирование обеих версий на других устройствах, включая VD (виртуальные устройства), работало.
В первой версии кода я передал Activity из вызывающей активности; для сохранения из активности, когда конечный бит данных собирается от пользователя, и для загрузки из моего основного действия, чтобы он был готов при запуске приложения.
Я играл с uninsalling приложения и повторно intalling, выключая устройство снова и снова прошлой ночью безрезультатно.
Теперь я переместил методы сохранения и загрузки из класса приложения в активность, где я заполняю входные данные, то есть как загрузка, так и сохранение кода теперь находятся в одной и той же активности. Я тестировал это с обеих вариаций кода, и они оба работают. Я возвращаю то, что я сохраняю. Затем я переместил весь код обратно в класс Application, и он работает; это заставляет меня поверить, что каким-то образом со всей установкой/удалением я каким-то образом сумел заставить его работать. Точка: код правильный - если он не работает, возможно, устройство и/или настройки виноваты
Ответ 7
У меня такая же проблема, и я некоторое время страдал от этого, наконец, нашел решение,
и это так просто, просто передайте прямую ссылку на активность и не используйте общий контекст
public SessionManagment(Activity mContextActivity){
// this.contextActivity = mContext;
sharedPrefSession = mContextActivity.getSharedPreferences(
Constants.SHARED_PREFERANCES_LIGHT_TIGER_SESSION_FILE_NAME,
Context.MODE_PRIVATE);
}//enden constructor
приведенный выше код является конструктором класса, который я написал для управления сеансом, и
и когда я вызываю его в коде в основном ActivityFramgment в AsyncTask, я вызываю его так:
SessionManagment sessionManagment = new SessionManagment(referanct2thisActivity);
где referanct2thisActivity определен в функции onCreate активности фрагмента, такой как
referanct2thisActivity = this;
надеюсь, что это поможет другим в будущем