SharedPreferences не будет сохранять / загружать в PreferenceActivity - PullRequest
13 голосов
/ 28 июня 2011

РЕДАКТИРОВАТЬ: Проблема, описанная ниже, была связана с очень специфической проблемой устройства, не вызванной какой-либо проблемой, связанной с кодированием.

У меня есть preferenceActivity, в котором у меня есть много checkBoxPreferences. Предполагается, что checkBoxPreference сохраняет файл общих настроек по умолчанию, а затем снова вызывается при открытии приложения для обновления пользовательского интерфейса.

Это не так, как должно быть. Если я закрою приложение и снова открою его, мои значения останутся такими, какими они должны быть, но если я использую диспетчер задач для завершения приложения или если я выключу и снова включу телефон (когда приложение не запущено), то вызываются значения по умолчанию еще раз.

Итак, я создал SharedPreference в моем onResume () для его проверки.

SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());

Затем я проверяю, есть ли ключ в этом общем предпочтении.

pref.contains("myCheckBoxPreference");

Когда я закрываю и снова открываю его, он возвращает истину. если я закрываю с диспетчером задач или выключаю и снова включаю телефон, то это возвращает 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, и оно все равно имело тот же эффект.

И я удалил приложение с телефона, затем выключил и снова включил телефон, а затем переустановил, и он все еще имеет тот же эффект.

Ответы [ 7 ]

7 голосов
/ 02 июля 2011

Я только что решил, я почти уверен.Там нет ошибки кода с моей стороны, и нет никаких проблем с моим приложением вообще (я не верю, в любом случае.)

Я создал новый проект под названием "testproj", а затем скопировал ВСЕ код измои настройки PreferenceActivity, вставили его в TestprojActivity, я скопировал код из xml, на который он опирался, затем вставил его в main.xml TestProj.

Затем я установил TestProj на Samsung Captivate, изменилнастройки вокруг, очистили оперативную память через управление оперативной памятью (это функция пользовательского ПЗУ, которую я имею), и настройки застряли.Затем я включил и снова включил телефон, и настройки все еще были там, как я их настроил.

Они остались, когда я вручную установил их, используя:

PreferenceManager.getDefaultSharedPreferences();

и без сохранения их вручную вSharedPreferences.

Поскольку это не мой телефон, я еще не пробовал его, но я предполагаю, что сброс заводских данных полностью его исправит РЕДАКТИРОВАТЬ: Я смог протестировать обановый Samsung Captivate и Samsung вселить, и это сработало.

Я потратил много времени, пытаясь выяснить это, и я надеюсь, что это поможет кому-то еще.:)

6 голосов
/ 02 июля 2011

Я столкнулся с возможно похожей проблемой на Samsung Galaxy S, где разрешения для файла настроек XML каким-то образом изменились / были повреждены.

Журнал показал, что какой-то хост-процесс не смог прочитать файл, в результате чего все настройки были сброшены до значений по умолчанию. Я не помню точное сообщение об ошибке, но оно было похоже на «Отказано в разрешении для /path/to/preferences/file.xml".

Для меня было разрешено удалить данные приложения через Настройки, Приложения, Управление приложениями, MyApp, Удалить данные. При этом удаляется файл настроек, связанный с приложением, и проблема мгновенно исчезает.

Я предположил, что это было изолированное событие, поскольку я больше не сталкивался с ним на различных устройствах Android (включая Galaxy S II).

3 голосов
/ 26 сентября 2011

На основном тестовом устройстве клиента я столкнулся с той же самой проблемой. Используемое устройство - Samsung Galaxy S с уровнем SDK 8 (2.2.1).

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

Из-за текущего дистрибутива из 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"
    
2 голосов
/ 23 сентября 2013

Попробуйте очистить редактор, прежде чем устанавливать свои значения.У меня была такая же проблема, и она работала для меня.Пример:

Editor e = PreferenceManager.getDefaultSharedPreferences(getParent()).edit();
e.clear();
e.putStringSet(key, value);
0 голосов
/ 22 августа 2013

У меня та же проблема, и я некоторое время страдал от нее, наконец-то я нашел решение, и это так просто, просто передайте прямую ссылку на упражнение и не используйте никакого общего контекста

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;

надеюсь, что это поможет другим в будущем

0 голосов
/ 16 июля 2013

У меня тоже была проблема с сохранением и последующим получением данных. У меня был код Save and Load в классе, который расширяет Application, потому что я хотел один экземпляр моих данных. Я мог видеть сохраняемую строку, без ошибок в LogCat, и все же, когда я пытаюсь загрузить ее, снова без ошибок, моя строка пуста. Я никогда не проверял, действительно ли данные были помещены в файл, поэтому я понятия не имею, был ли сбой при сохранении или загрузке, или в обоих случаях.

Мой код был примерно следующим: (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 ());

Здесь есть еще здесь на разнице между этими двумя (хотя в моем случае это выглядит точно так же)

Тем не менее результат на моем Galaxy S3 был таким же. Однако тестирование обеих версий на других устройствах, включая VD (виртуальные устройства), сработало.

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

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

Теперь я переместил методы сохранения и загрузки из класса приложения в действие, в котором я завершил ввод, т. Е. И загрузка, и код сохранения теперь выполняются в одном действии. Я проверил это с обоими вариантами кода, и они оба работают. Я возвращаю то, что я спасаю. Затем я переместил весь код обратно в класс Application, и он работает; это наводит меня на мысль, что каким-то образом со всей установкой / удалением мне как-то удалось заставить его работать. Дело в том, что код правильный - если он не работает, возможно, виноваты устройства и / или настройки

0 голосов
/ 09 ноября 2011

Можно обойти проблему разрешений, используя sharedUserId, который должен быть одинаковым для любых ваших подписанных приложений.

http://developer.android.com/reference/android/R.attr.html#sharedUserId

...