Подтвердить что ты не робот

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, и оно все равно имело тот же эффект.

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

4b9b3361

Ответ 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);

Ответ 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;

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