- SharedPreferences
- Сохранение значений параметров
- Чтение значений параметров
- Очистка значений
- Методы getStringSet() и putStringSet()
- Удаление файла
- Метод getPreferences() — Сохранение состояния активности
- Сохранение настроек на SD-карту
- Я у тебя первый?
- Запомнить пользователя
- Запомнить состояние переключателей
- getDefaultSharedPreferences()
- Удаляем файл настроек
- Можно ли добавить массив или объект в SharedPreferences на Android
- 9 ответов
- Сохранить ArrayList в SharedPreferences
- 30 ответов
- Можно ли добавить массив или объект в SharedPreferences на Android?
- 10 ответов
SharedPreferences
Чтобы получить экземпляр класса SharedPreferences для получения доступа к настройкам в коде приложения используются три метода:
- getPreferences() — внутри активности, чтобы обратиться к определённому для активности предпочтению;
- getSharedPreferences() — внутри активности, чтобы обратиться к предпочтению на уровне приложения;
- getDefaultSharedPreferences() — из объекта PreferencesManager, чтобы получить общедоступную настройку, предоставляемую Android.
Все эти методы возвращают экземпляр класса SharedPreferences, из которого можно получить соответствующую настройку с помощью ряда методов:
- getBoolean(String key, boolean defValue)
- getFloat(String key, float defValue)
- getInt(String key, int defValue)
- getLong(String key, long defValue)
- getString(String key, String defValue)
Обратите внимание, что тип double не поддерживается.
Чтобы создать или изменить Общие настройки, нужно вызвать метод getSharedPreferences в контексте приложения, передав имя общих настроек (имя файла):
По умолчанию используется MODE_PRIVATE — только приложение имеет доступ к настройкам. Также существуют другие режимы, с которыми практически не встречался.
- MODE_APPEND — присоединяет новые настройки к существующим
- MODE_ENABLE_WRITE_AHEAD_LOGGING
- MODE_MULTI_PROCESS
- MODE_WORLD_READABLE — позволяет другим приложениям читать настройки
- MODE_WORLD_WRITEABLE — позволяет другим приложениям записывать новые настройки
Для любознательных могу добавить, что файлы настроек хранятся в каталоге /data/data/имя_пакета/shared_prefs/имя_файла_настроек.xml. Поэтому в отладочных целях, если вам нужно сбросить настройки в эмуляторе, то при помощи перспективы DDMS, используя файловый менеджер, зайдите в нужную папку, удалите файл настроек и перезапустите эмулятор, так как эмулятор хранит данные в памяти, которые он сбрасывает в файл. На устройстве вы можете удалить программу и поставить ее заново, то же самое можно сделать и на эмуляторе, что бывает проще, чем удалять файл настроек вручную и перезапускать эмулятор.
Если открыть файл настроек текстовым редактором, то можно увидеть приблизительно такое:
В данном случае в настройках хранятся только строковые значения.
Сохранение значений параметров
Для удобства создадим константу для имени файла настроек, например:
Далее нужно создать параметры, которые вы хотите сохранять в настройках. Удобнее их сделать константами:
Когда вы определили названия параметров, то можете сохранять любые значения этих параметров. Для этого создаём переменную, представляющую экземпляр класса SharedPreferences:
Внутри метода onCreate() вы инициализируете эту переменную:
Вы передаёте в указанный метод название вашего файла (он будет создан автоматически) и стандартное разрешение, дающее доступ только компонентам приложения.
Чтобы внести изменения в настройки (редактировать), нужно использовать класс SharedPreferences.Editor. Получить объект Editor можно через вызов метода edit объекта SharedPreferences, который вы хотите изменить. После того, как вы внесли все необходимые изменения, вызовите метод commit() или apply() объекта Editor, чтобы изменения вступили в силу. Метод apply() появился в API 9 и работает в асинхронном режиме, что является более предпочтительным вариантом. Метод commit() приходится использовать для старых версий и кроме того, он возвращает значение true в успешном случае и false в случае ошибки. Если вам надо отслеживать ошибки, то используйте его.
Предположим, что у нас есть два текстовых поля, где пользователь должен ввести имя кота и его и возраст. Чтобы сохранить параметр, нужно получить текст, который ввел пользователь, через метод getText().toString():
Получив нужный текст, сохраняем его через метод putString() (есть также putLong(), putBoolean() и т.п.):
Как правило, параметры сохраняют в методах активности onPause() или onStop() в тех случаях, когда данные требуются сохранить между запусками приложения. Но могут быть и другие сценарии.
Чтение значений параметров
Для считывания данных при загрузке приложения обычно используют методы onCreate() или onResume(). Нам нужно получить доступ к настройкам программы и проверить, есть ли среди них нужный нам параметр. Нас интересует ключ Nickname. Если мы его найдём, то загрузим его значение в текстовое поле.
В этих строчках кода мы проверили существование параметра APP_PREFERENCES_NAME и получили его значение через getString(), передавая ключ и значение по умолчанию (используется в том случае, если для данного ключа пока что не сохранено никакое значение). Осталось только загрузить полученный результат в текстовое поле.
Аналогично поступаем и с другими параметрами через методы get () (getLong, getBoolean() и т.д.).
Если вам ещё не понятно, то ниже исходный код:
Показать код (щелкните мышкой)
Можно получить ассоциативный массив со всеми ключами и значениями через метод getAll(). После этого можно проверить наличие конкретного ключа с помощью метода contains().
Очистка значений
Для очистки значений используйте методы SharedPreferences.Editor.remove(String key) и SharedPreferences.Editor.clear().
Методы getStringSet() и putStringSet()
Начиная с API 11, у класса SharedPreferences появился новый метод getStringSet(), а у класса SharedPreferences.Editor родственный ему метод putStringSet(). Данные методы позволяют работать с наборами строк, что бывает удобно при большом количестве настроек, которые нужно сразу записать или считать.
Удаление файла
Как я уже сказал, файл настроек хранится в /data/data/имя_пакета/shared_prefs/имя_файла_настроек.xml. Вы можете удалить его программно, например так:
Учтите, что данные могут оставаться в памяти и временном файле *.bak. Поэтому, даже после удаления файла, он может заново воссоздаться. Вообще удалять файл не рекомендуется. Он автоматически удалится при удалении самой программы.
Метод getPreferences() — Сохранение состояния активности
Если вы хотите сохранить информацию, которая принадлежит активности и не должна быть доступна другим компонентам (например, переменным экземпляра класса), вы можете вызвать метод Activity.getPreferences() без указания названия Общих настроек. Доступ к возвращённому ассоциативному массиву Общих настроек ограничен активностью, из которой он был вызван. Каждая активность поддерживает только один безымянный объект Общих настроек.
Сохранение настроек на SD-карту
Сам файл с настройками хранится в системе и обычному пользователю он не виден. Если вам понадобится получить все значения, хранимые в настройках, то вы можете считать все данные при помощи метода getAll() и записать их в файл, который можно сохранить на SD-карте:
Я у тебя первый?
Предположим, вы хотите выводить пользователю какую-то информацию при первом запуске приложения (краткую инструкцию, заставку и т.п.).
Запомнить пользователя
Иногда требуется запомнить имя пользователя или другие данные (пин-код, номер телефона и т.д.). В этом случае вам также подойдут предпочтения, когда вы просто сохраняете нужную строку из текстового поля:
Запомнить состояние переключателей
Если нужно запомнить состояние переключателей, то код может быть таким. Создадим разметку с тремя переключателями.
Код, который отслеживает выбор переключателя и записывает состояние в настройки.
getDefaultSharedPreferences()
В используемых примерах я использовал getSharedPreferences() с придумыванием имени файла для хранения настроек. Этот способ придаёт гибкости в том случае, когда вам нужно создать несколько отдельных файлов. Но если вам нужен один файл, то можно ничего не придумывать, а использовать метод getDefaultSharedPreferences() из объекта PreferencesManager. Система сама сгенерирует имя файла из имени вашего пакета с добавлением слова _preferences. Вот как выглядит связка из трёх методов в исходниках Android (обратите внимание на выделенный текст).
Поэтому примеры можно переделать следующим образом.
Удаляем файл настроек
В API 24 появился новый метод, позволяющий удалить сам файл настроек. До этого можно было удалить своими силами, зная его местоположение. Поэтому универсальный код будет приблизительно следующим.
Источник
Можно ли добавить массив или объект в SharedPreferences на Android
у меня есть ArrayList объектов, которые имеют имя и указатель на значок, и я хочу сохранить его в SharedPreferences . Как я могу это сделать?
примечание: Я не хочу использовать Database
9 ответов
Итак, с сайта разработчика android на Хранилище Данных:
общие параметры предназначены не только для сохранения «пользовательских настроек», например, какой рингтон выбрал пользователь. Если вы заинтересованы в создании пользовательских настроек для своего приложения, см. раздел PreferenceActivity, который предоставляет платформу действий для создания пользовательских настроек, которые будут автоматически сохраняться (с помощью shared персональные настройки.)
поэтому я думаю, что это нормально, так как это просто пары ключ-значение, которые сохраняются.
для оригинального плаката это не так сложно. Вы просто повторяете список массивов и добавляете элементы. В этом примере я использую карту для простоты, но вы можете использовать список массивов и изменить его соответствующим образом:
вы бы сделали что-то подобное, чтобы снова прочитать пары ключ-значение. Дайте мне знать, если это завод.
обновление: если вы используете API уровня 11 или выше,метод чтобы написать набор строк
СОХРАНИТЬ МАССИВ
ЗАГРУЗИТЬ МАССИВ
Общие настройки ввел getStringSet и putStringSet методы на уровне API 11, но это не совместимо со старыми версиями Android (которые все еще популярны), а также ограничено наборами строк.
Android не предоставляет лучших методов, и цикл над картами и массивами для их сохранения и загрузки не очень прост и чист, особенно для массивов. Но лучшая реализация не так уж сложно:
теперь вы можете сохранить любую коллекцию в shared предпочтения с помощью этих пяти методов. Работа с JSONObject и JSONArray очень легко. Вы можете использовать JSONArray (Collection copyFrom) public конструктор, чтобы сделать JSONArray из любой коллекции Java и использовать JSONArray ‘ s get методы доступа к элементам.
нет ограничений по размеру для общих настроек (кроме ограничений хранения устройства), поэтому эти методы могут работать для большинства обычных случаев, когда вы хотите быстрое и простое хранение для некоторой коллекции в вашем приложении. Но разбор JSON происходит здесь, и предпочтения в Android хранятся как XMLs внутри, поэтому я рекомендую использовать другие механизмы постоянного хранилища данных, когда вы имеете дело с мегабайтами данных.
простой режим для хранения сложных объектов с использованием библиотеки Gson google [1]
Я загрузил массив размеров талии (уже созданный в моем массиве.xml) в мои предпочтения.xml-файл с кодом ниже. @array/pant_inch_size-это идентификатор всего массива.
это заполняет меню с вариантами из массива. Я установил размер по умолчанию как 34, поэтому, когда появляется меню, они видят, что размер 34 предварительно выбран.
простой способ-преобразовать его в строку JSON, как показано ниже:
затем сохраните строку в общих настройках. Как только вам это нужно, просто получите строку из общих настроек и преобразуйте обратно в JSONArray или JSONObject(согласно вашему требованию.)
Источник
Сохранить ArrayList в SharedPreferences
у меня есть ArrayList с пользовательскими объектами. Каждый пользовательский объект содержит множество строк и чисел. Мне нужен массив, чтобы придерживаться, даже если пользователь покидает действие, а затем хочет вернуться позже, однако мне не нужен массив, доступный после того, как приложение было полностью закрыто. Я сохраняю много других объектов таким образом, используя SharedPreferences но я не могу понять, как сохранить весь мой массив таким образом. Возможно ли это? Может быть!—1—> это не путь об этом? Есть ли более простой метод?
30 ответов
после API 11 SharedPreferences Editor принимать Sets . Вы можете преобразовать свой список в HashSet или что-то подобное и хранить его так. Когда вы прочитаете его обратно, преобразуйте его в ArrayList , а если необходимо и вы хорошо идти.
вы также можете сериализовать свой ArrayList а затем сохранить / прочитать его в / из SharedPreferences . Ниже приведено решение:
EDIT:
Хорошо, Ниже приведено решение для сохранения ArrayList как сериализованный объект SharedPreferences а затем прочитайте его из SharedPreferences.
поскольку API поддерживает только хранение и извлечение строк в / из SharedPreferences (после API 11, его проще), мы должны сериализовать и де-сериализовать объект ArrayList, который имеет список задач в строку.
на addTask() метод класса TaskManagerApplication, мы должны получить экземпляр общего предпочтения, а затем сохранить сериализованный ArrayList с помощью putString() метод:
аналогично мы должны получить список задач из предпочтения в onCreate() способ:
Источник
Можно ли добавить массив или объект в SharedPreferences на Android?
У меня есть ArrayList объектов, у которых есть имя и указатель значка, и я хочу сохранить его в SharedPreferences . Как я могу сделать?
ПРИМЕЧАНИЕ. Я не хочу использовать базу данных
10 ответов
Итак, с сайта разработчика Android на хранилище данных:
Общие настройки не предназначены строго для сохранения «пользовательских настроек» , например того, какую мелодию звонка выбрал пользователь. Если вы заинтересованы в создании пользовательских настроек для своего приложения, см. PreferenceActivity, который предоставляет платформу Activity для создания пользовательских настроек, которые будут автоматически сохраняться (с использованием общих настроек).
Так что я думаю, что это нормально, поскольку сохраняются просто пары ключ-значение.
Для оригинального плаката это не так уж и сложно. Вы просто просматриваете свой список массивов и добавляете элементы. В этом примере для простоты я использую карту, но вы можете использовать список массивов и соответствующим образом изменить его:
Вы бы сделали что-то подобное, чтобы снова прочитать пары ключ-значение. Сообщите мне, если это сработает.
Обновление: если вы используете API уровня 11 или новее, существует метод для записи набора строк
СОХРАНИТЬ МАССИВ
ЗАГРУЗИТЬ
Другой способ сделать то же самое:
Использование GSON в Java:
Использование GSON в Котлине
Простой режим для хранения сложных объектов с использованием библиотеки Gson google [1]
Я загрузил массив размеров талии (уже созданный в моем array.xml) в свой файл preferences.xml с приведенным ниже кодом. @ array / pant_inch_size — это идентификатор всего массива.
Это заполнило меню вариантами из массива. Я установил размер по умолчанию 34, поэтому, когда всплывает меню, они видят, что размер 34 предварительно выбран.
Самый простой способ — преобразовать его в строку JSON, как показано ниже:
Затем сохраните строку в общих настройках. Как только вам это понадобится, просто получите строку из общих настроек и конвертируйте обратно в JSONArray или JSONObject (в соответствии с вашими требованиями).
Это код общих настроек, который я успешно использую. См. Эту ссылку :
Вы можете использовать putStringSet
Это позволит вам сохранить HashSet в ваших предпочтениях, вот так:
Получить
PutStringSet позволяет использовать только Set, и это неупорядоченный список.
Когда я столкнулся с этим, я получил решение для сериализации, в котором вы можете сериализовать свою строку, но я также придумал хак.
Прочтите это, только если вы еще не читали о сериализации, иначе прочитайте мой хак
Чтобы хранить элементы массива по порядку, мы можем сериализовать массив в одну строку (создав новый класс ObjectSerializer (скопируйте код с — www.androiddevcourse.com/objectserializer.html, замените все, кроме имени пакета). ))
Ввод данных в общих настройках.
остальной код в строке 38 —
Поставьте следующий аргумент следующим образом, чтобы, если данные не были получены, они возвращали пустой массив (мы не можем поместить пустую строку, поскольку контейнер / переменная является массивом, а не строкой)
Прихожу к моему хаку: —
Объедините содержимое массива в одну строку, поместив некоторый символ между каждым элементом, а затем разделите его, используя этот символ при его извлечении. Coz добавить и получить String легко с общими настройками. Если вас беспокоит разделение, просто найдите «разделение строки в java».
[Примечание: Это прекрасно работает, если содержимое вашего массива имеет примитивный вид, такой как string, int, float и т. Д. Это будет работать для сложных массивов, которые имеют свою собственную структуру, например телефонную книгу, но слияние и разбиение станут немного сложнее. ]
PS: я новичок в Android, поэтому не знаю, если это хороший взлом, так что позвольте мне знать, если вы найдете лучшие хаки.
Источник