Что такое preferences андроид

Содержание
  1. SharedPreferences
  2. Сохранение значений параметров
  3. Чтение значений параметров
  4. Очистка значений
  5. Методы getStringSet() и putStringSet()
  6. Удаление файла
  7. Метод getPreferences() — Сохранение состояния активности
  8. Сохранение настроек на SD-карту
  9. Я у тебя первый?
  10. Запомнить пользователя
  11. Запомнить состояние переключателей
  12. getDefaultSharedPreferences()
  13. Удаляем файл настроек
  14. SharedPreferences. Сохранение данных в постоянное хранилище Android
  15. Preferences Framework
  16. CheckBoxPreference
  17. EditTextPreference
  18. ListPreference
  19. SwitchPreference
  20. RingtonePreference
  21. PreferenceCategory
  22. PreferenceScreen
  23. Импорт системных настроек
  24. Настройки с зависимостями
  25. Отслеживание изменений в Общих настройках
  26. Меняем фон экрана настройки
  27. SeekBarDialogPreference
  28. res/layouts/preference_seek_bar_dialog.xml
  29. res/values/attrs.xml
  30. SeekBarDialogPreference.java
  31. res/xml/settings.xml
  32. NumberPickerDialogPreference
  33. res/layouts/preference_number_picker_dialog.xml
  34. res/values/attrs.xml
  35. NumberPickerDialogPreference.java
  36. Секретная настройка VolumePreference
  37. PreferenceFragment
  38. Заголовки настроек
  39. header_settings.xml
  40. HeaderPrefsActivity.java
  41. UpdatePreferenceFragment.java
  42. preference_update.xml
  43. Открыть браузер по ссылке
  44. Выводим настройку в подсказку
  45. Открываем окно настроек из системных настроек Передача данных

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-карте:

Читайте также:  Xiaomi mi box 3 прошивка андроид 10

Я у тебя первый?

Предположим, вы хотите выводить пользователю какую-то информацию при первом запуске приложения (краткую инструкцию, заставку и т.п.).

Запомнить пользователя

Иногда требуется запомнить имя пользователя или другие данные (пин-код, номер телефона и т.д.). В этом случае вам также подойдут предпочтения, когда вы просто сохраняете нужную строку из текстового поля:

Запомнить состояние переключателей

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

Код, который отслеживает выбор переключателя и записывает состояние в настройки.

getDefaultSharedPreferences()

В используемых примерах я использовал getSharedPreferences() с придумыванием имени файла для хранения настроек. Этот способ придаёт гибкости в том случае, когда вам нужно создать несколько отдельных файлов. Но если вам нужен один файл, то можно ничего не придумывать, а использовать метод getDefaultSharedPreferences() из объекта PreferencesManager. Система сама сгенерирует имя файла из имени вашего пакета с добавлением слова _preferences. Вот как выглядит связка из трёх методов в исходниках Android (обратите внимание на выделенный текст).

Поэтому примеры можно переделать следующим образом.

Удаляем файл настроек

В API 24 появился новый метод, позволяющий удалить сам файл настроек. До этого можно было удалить своими силами, зная его местоположение. Поэтому универсальный код будет приблизительно следующим.

Источник

SharedPreferences. Сохранение данных в постоянное хранилище Android

SharedPreferences — постоянное хранилище на платформе Android, используемое приложениями для хранения своих настроек, например. Это хранилище является относительно постоянным, пользователь может зайти в настройки приложения и очистить данные приложения, тем самым очистив все данные в хранилище.

Для работы с данными постоянного хранилища нам понадобится экземпляр класса SharedPreferences, который можно получить у любого объекта, унаследованного от класса android.content.Context (например, Activity или Service). У объектов этих классов (унаследованных от Context) есть метод getSharedPreferences, который принимает 2 параметра:

  • name — выбранный файл настроек. Если файл настроек с таким именем не существует, он будет создан при вызове метода edit() и фиксировании изменений с помощью метода commit().
  • mode — режим работы. Возможные значения:
    • MODE_PRIVATE — используется в большинстве случаев для приватного доступа к данным приложением-владельцем
    • MODE_WORLD_READABLE — только для чтения
    • MODE_WORLD_WRITEABLE — только записи
    • MODE_MULTI_PROCESS — несколько процессов совместно используют один файл SharedPreferences.

ВНИМАНИЕ! Все модификаторы кроме MODE_PRIVATE в настоящий момент объявлены deprecated и не рекомендуются к использованию в целях безопасности. Если необходимо реализовать использование общих данных несколькими приложениями, это можно сделать через сервисы или контент-провайдеры. Подробнее можно почитать, например, здесь.

Чтобы получить значение необходимой переменной, используйте следующие методы объекта 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),
  • getStringSet(String key, Set defValues).

Второй параметр — значение, которое вернется в случае если значение по ключу key отсутствует в SharedPreferences. Также, методом getAll() можно получить все доступные значения.

Чтобы записать значение переменной необходимо:

  1. получить объект SharedPreferences.Editor выполнив метод edit() объекта класса SharedPreferences
  2. записать значение с помощью методов:
    • putBoolean(String key, boolean value),
    • putFloat(String key, float value),
    • putInt(String key, int value),
    • putLong(String key, long value),
    • putString(String key, String value),
    • putStringSet(String key, Set values)
  3. выполнить метод commit()

Также есть возможность удалить конкретное значение (remove(String key)) или все значения (clear())

Приведенный ниже код демонстрирует запись переменной типа String в хранилище:

Источник

Preferences Framework

Настройки могут быть скрытыми или открытыми. Например, мы можем подсчитывать, сколько раз пользователь запускал нашу программу и при сотом запуске подарить ему бонус. Счётчик запуска приложения мы храним в файле настроек, но пользователь ничего не знает об этом. Но бывает так, что нам необходимо дать пользователю настроить функциональность приложения под свои вкусы. Например, сделать настройку «Напоминать о дне рождения котика». Если пользователь установит флажок у этой настройки (пусть только попробует не установить), то программа напомнит ему в нужный день о необходимости купить тортик.

Часто для этих целей в приложениях используют отдельный экран с настройками. Безусловно вы можете создать собственный xml-файл разметки и разместить там нужные элементы управления. Но Android для этих целей предоставляет собственный Preferences Framework, с помощью которого можно создавать индивидуальный набор предпочтений и встраивать их в приложения. Главное преимущество использования фреймворка состоит в том, что экран настроек выглядит стандартно во всех приложениях и позволяет пользователю быстрее разобраться в работе.

Кроме того фреймворк настроек позволяет прослушивать изменения в Общих настройках через реализацию метода onSharedPreferenceChangeListener().

Использование фреймворка позволяет быстро создать экран настроек практически без написания кода. Предпочтения — это отдельная активность в приложении, вызываемая из вашей активности. Сама активность настроек расширяется от класса PreferenceActivity, а не от стандартного класса Activity. Предпочтения определяются в отдельном XML-файле, где корневым элементом является элемент

Далее нужно построить свой экран настроек, используя готовые компоненты.

Для сохранения предпочтений используются различные классы:

У элементов кроме своих собственных атрибутов есть обязательные атрибуты:

  • android:key — ключ, по которому можно определять значение
  • android:title — краткий текст настройки
  • android:summary — длинное описание настройки. Отражается под кратким текстом более мелким шрифтом
  • android:defaultValue — значение по умолчанию, которое будет использовано, если ничего не было выбрано

CheckBoxPreference

В созданном файле устанавливаем настройки. Начнём с CheckBoxPreference.

Мы определили две настройки для программы:

  1. включение и выключение Wi-Fi
  2. показ подсказок

В нашем случае мы выводим флажки (элемент CheckBoxPreference), которые по умолчанию будут отмечены (атрибут android:defaultValue).

Не забываем добавить новые строковые ресурсы в файл res/values/strings.xml:

Далее создаём новый класс MyPreferenceActivity, который будет наследоваться от класса PreferenceActivity. Добавим знакомый метод onCreate(), только вместо setContentView() вызовем метод addPreferencesFromResource, который по сути делает такую же работу — берёт данные из XML-файла и строит внешний вид экрана активности:

Метод addPreferencesFromResource() считывает установленные настройки из XML-файла, где хранятся наши ресурсы, и делает их доступными для программы. В результате мы должны увидеть настройки на экране. Не забываем зарегистрировать новую активность в манифесте:

Читайте также:  Как написать кейлоггер для андроид

Ресурс settings_title подготовьте самостоятельно.

Напишем метод для вывода окна настроек, который можно повесить на щелчок мыши или пункта меню:

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

Наверное, вы обратили внимание, что метод addPreferencesFromResource() был зачёркнут и помечен, как устаревший. В новых версиях Android следует использовать фрагмент PreferenceFragment, о котором поговорим в другой раз.

EditTextPreference

Мы научились сохранять настройки при помощи флажков. Существует также возможность сохранения настроек в текстовом виде при помощи EditTextPreference. Подобный способ настройки позволяет сохранять текст, вводимый пользователем. Давайте добавим возможность устанавливать размер шрифта для текста. Откроем снова файл settings.xml и добавим новый элемент EditTextPreference:

Для удобства я буду сразу выводить строковые значения без использования строковых ресурсов. В своих рабочих проектах вам нужно использовать ресурсы обязательно.

Запустите проект и вызовите окно настроек. Теперь у нас появилась опция установки размера шрифта. Если щёлкнуть на созданном элементе, то откроется новое диалоговое окно с текстовым полем ввода.

В следующем уроке мы разберём, как считывать установленные значения размера шрифта.

ListPreference

Также можно использовать списки для хранения настроек. Для этой цели используется диалоговое окно ListPreference. Необходимо заранее подготовить строковый ресурс для заголовка и массив строк для самого списка значений. Индекс выбранной строки списка будет задавать нужное значение для сохранения в SharedPreferences.

Добавим список для выбора стиля текста. В списке будет четыре опции: Обычный, Полужирный, Курсив, Полужирный+Курсив.

Подготовим массив строк и сохраним его в файле arrays.xml, который необходимо поместить в каталог res/values/.

В файл настроек settings.xml добавим дополнительный элемент
, в котором определим атрибуты заголовка окна, привязку к массиву значений и значение по умолчанию:

Код для чтения настроек из списка рассматривается в следующем уроке.

Запустив проект, вы теперь увидите новую настройку Стиль для шрифта, которая открывает диалоговое окно для выбора стиля из списка. Обратите внимание, что в диалоговом окне нет кнопки сохранения, только Отмена. Изменения сохраняются сразу при выборе опции списка.

SwitchPreference

Поняв общий принцип, вы можете сами разобраться с другими элементами настроек. Рассмотрим ещё один элемент — SwitchPreference, который является заменой для CheckBoxPreference и позволяет включать или выключать настройку.

В результате получим:

В зависимости от выбранного варианта мы можем менять текст настройки через атрибуты summaryOn/summaryOff.

RingtonePreference

Рассмотрим работу с настройкой, связанной с установкой мелодии для звонка. Предпочтение предоставляет диалоговое окно выбора мелодии звонка со списком опций. Список в диалоговом окне отображает мелодии для звонка, уведомлений, тонового набора, доступные на мобильном устройстве. Также предусмотрена возможность добавления дополнительной опции «Silent» (Тихий режим) — добавьте атрибут android:showSilent=»true».

Создадим новый файл настроек res/xml/ringtone_preference.xml:

Создадим новую активность настроек для рингтонов RingtonePreferenceActivity, повторив шаги из предыдущего примера. Запустим созданную активность.

PreferenceCategory

Если в приложении используется слишком много настроек разного типа, то можно сгруппировать их по категориям, чтобы улучшить внешний вид окна настроек. Для этого в Preferences Framework есть специальный элемент PreferenceCategory.

Еще раз вернёмся к статье Создание простого текстового редактора, где использовались настройки для открытия файла и для работы с текстом (Размер шрифта и стиль шрифта). Почему бы нам не разбить настройки на две категории: к первой категории мы отнесем настройку открытия файла, а ко второй две настройки, связанные с шрифтами.

Категории добавляются через элемент

Если вы посмотрите на экран настроек, то увидите дополнительную полоску с текстом «Настройки шрифта».

PreferenceScreen

Кроме корневого элемента

Запустив приложение, вы увидите новую настройку Цвет текста, которая открывает новое окно для выбора цвета текста.

Вам остаётся только написать код для обработки выбора пользователя, чтобы вывести текст в текстовом редакторе в нужном цвете. Обратите внимание, что в нашем примере используются флажки, которые позволяют создавать комбинации различных цветов.

Исходный код для текстового редактора смотрите здесь

Импорт системных настроек

У фреймворка есть интересная особенность — можно внедрить в экран настроек вашего приложения вызов системных настроек. Делается это следующим образом. В файл настроек добавляем новый блок, например, такой:

Класс android.provider.Settings включает множество констант типа android.settings.*, которые можно использовать для вызова экранов системных настроек. Я выбрал настройку Автономного режима, также можно было вызвать настройку Экрана (android.settings.DISPLAY_SETTINGS). На экране настроек появится новый пункт, который автоматически сработает при нажатии.

При использовании данного способа система интерпретирует это как запрос на вызов метода startActivity() с указанным действием. Это очень удобно, когда из вашего экрана настроек нужно вызвать стандартную системную настройку.

Настройки с зависимостями

Иногда требуется, чтобы часть настроек была связана с определённой родительской настройкой. И если родительская настройка заблокирована, то есть смысл автоматически заблокировать и дочерние настройки. Для этой цели применяется атрибут android:dependency.

Мы указали, что текстовое поле зависит от родительского флажка. Запустим и сравним поведение в двух разных случаях.

Отслеживание изменений в Общих настройках

Как уже упоминалось, класс onSharedPreferenceChangeListener позволяет вызвать callback-метод в момент добавления, удаления или изменения конкретной Общей настройки. Используя этот обработчик, компоненты вашего приложения могут следить за изменениями в настройках, установленных пользователем, и обновлять пользовательский интерфейс или корректировать поведение программы.

Зарегистрируйте обработчик OnSharedPreferenceChangeListener, применив Общие настройки, за которыми вы хотите следить. Реализация onSharedPreferenceChanged() показана ниже (каркас):

Меняем фон экрана настройки

При создании экрана настроек мы полагаемся на систему. В одной из версий Android по умолчанию фон активности был чёрным, сейчас белый. Если вы хотите применить свой цвет, то добавьте строчку кода:

Про PreferenceFragment рассказывается в конце статьи.

Если вы хотите поменять цвета у PreferenceCategory, то тут немного сложнее. Придётся создать отдельный класс, наследующий от PreferenceCategory и переопределить метод onCreateView:

В файле разметки заменяем тег категории на свой:

Вот результат в дополнение к изменённому фону, где я поменял для наглядности и одну категорию.

Читайте также:  Возможности андроид с рут правами

По такому же принципу можно поменять и другие классы, в частности Preference.

SeekBarDialogPreference

Допустим, мы хотим настраивать параметр с помощью компонента SeekBar в диалоговом окне. Нам нужно наследоваться от класса DialogPreference и написать свой код.

res/layouts/preference_seek_bar_dialog.xml

res/values/attrs.xml

Подготовим атрибуты. Обратите внимание, что для некоторых атрибутов мы не используем свойства из пакета android.

SeekBarDialogPreference.java

Напишем новый класс.

res/xml/settings.xml

Добавляем в разметку экрана настройки новый компонент. Обратите внимание на третью строчку, которая позволяют задавать собственные атрибуты custom: вместо android:.

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

Чтобы получить установленные значения, напишем код в главной активности.

NumberPickerDialogPreference

Создадим диалоговое окно настройки с использованием NumberPicker.

res/layouts/preference_number_picker_dialog.xml

res/values/attrs.xml

Если вы будете использовать пример вместе с предыдущим примером SeekBarDialogPreference, то данный файл не понадобится, так как эти атрибуты уже у вас есть.

NumberPickerDialogPreference.java

Если вы используете пример вместе с предыдущим и не меняли файл attr.xml, то в коде придётся заменить некоторые строчки. По ошибкам вы поймёте, что нужно поменять.

Добавляем на экран настроек:

Секретная настройка VolumePreference

В Android есть секретный класс VolumePreference. Он как бы есть, но в редакторе настроек его нет, и вы не можете добавить его в XML-файл. Можно это сделать вручную. Впрочем, не обольщайтесь. Положение ползунка программа запоминает, но на уровень громкости устройства это никак не влияет, так как эта настройка системная и через приложение управлять ей нельзя. Также нельзя получить выбранные данные. Показываю пример просто для шутки.

Так это выглядит на экране.

PreferenceFragment

В старых версиях Android использовался класс PreferenceActivity с вызовом метода addPreferencesFromResource() для создания экрана настроек. Теперь подобный подход считается устаревшим и ему на смену пришёл класс PreferenceFragment (API 11).

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

Для начала создадим файл settings.xml в папке res/xml, как мы это делали и раньше.

Строковые ресурсы остаются те же:

Теперь вместо активности настроек PreferenceActivity нужно создать фрагмент настроек PreferenceFragment. Создаём новый класс:

Как видите, код практически тот же, только метод addPreferencesFromResource() относится уже не классу PreferenceActivity, а к классу PreferenceFragment.

Теперь в активности настроек, которая будет служить контейнером для фрагмента настроек, заменяем устаревший метод:

Получается, что мы перенесли код создания экрана настроек в фрагмент, а в активности просто подключаем этот фрагмент. Вот и вся принципиальная разница.

Если вы хотите поддерживать новые и старые версии настроек, то можно переписать код следующим образом:

Также можно использовать вариант выбора нужного класса и его запуска через намерение:

Осталось только вызвать экран настроек. В старом примере использовался метод showSettings(), его и оставляем и для нового примера:

Чисто внешне ничего не изменилось, поэтому скриншот приводить не буду.

Заголовки настроек

Приведённый выше пример носит скорее косметический характер, мы просто подключили фрагмент. Но появилось и новшество — использование заголовков (Preference Headers), когда пользователь видит на экране список заголовков, которые в свою очередь запускают отдельные фрагменты. Интересная особенность у данного решения — на больших экранах автоматически включается двухпанельный режим просмотра (у меня не заработало). Рассмотрим пример.

Создадим новый файл с применением заголовков в папке res/xml.

header_settings.xml

В каждом теге header мы задали атрибут android:fragment, указывающий на экземпляр класса PreferenceFragment, который должен открываться при выборе конкретного заголовка. В нашем примере заданы три заголовка.

Строковые ресурсы (придумайте свои):

Для загрузки заголовков понадобится активность, наследующая от PreferenceActivity. В ней нужно реализовать метод обратного вызова onBuildHeaders() и вызвать метод loadHeadersFromResource():

HeaderPrefsActivity.java

Обратите внимание, что в классе активности не требуется вызывать метод onCreate(), от активности требуется только загрузить заголовки (не забудьте прописать в манифесте).

В API 19 появилось какое-то глупое требование добавить проверку на валидность фрагмента. Просто добавьте в метод isValidFragment() используемые фрагменты. Без этого кода вылезает ошибка.

Займёмся созданием фрагмента настроек, который состоит из java-файла и разметки:

UpdatePreferenceFragment.java

preference_update.xml

По аналогии создайте два других фрагмента для остальных заголовков настроек.

Теперь, если щёлкнуть по заголовку настроек, то откроется соответствующий фрагмент.

Обратите внимание, тег ListPreference зависит от второго флажка (android:dependency=»pref_floor»). Если снять флажок, то список становится неактивным и выбрать количество этажей становится невозможным.

Для вызова активности настроек используется стандартный код:

На больших экранах окно настроек автоматически становится двухпанельным. Но в эмуляторе для Nexus 7 данный способ у меня не сработал. Насколько я понял, устройство должно иметь разрешение sw720dp, чтобы включился двухпанельный режим. Если вы хотите иметь такой режим на меньших экранах, то вам придётся самостоятельно писать код для создания двухпанельного режима.

Чтобы увидеть двухпанельный режим в эмуляторе, пришлось создавать новое устройство — планшет на 10 дюймов.

Открыть браузер по ссылке

Добавим в файл настроек settings.xml отдельный блок с указанием сайта.

Теперь, если пользователь в окне настроек щёлкнет по названию сайта, то запустится браузер с указанной страницей.

По такому же принципу вы можете вызвать любую активность и в заголовках. Тег intent будет расцениваться как запрос на вызов метода startActivity() с указанным действием.

Выводим настройку в подсказку

Когда мы используем ListPreference, то пользователю приходится нажимать на раздел настроек для вызова диалогового окна со списком, чтобы увидеть текущий выбор. Если пользователь хочет выбрать новое значение, то данный шаг оправдан. Но если ему нужно только получить информацию, то почему бы её не вывести прямо в подсказку (Summary)? Для этого можно воспользоваться методом setSummary().

Подготовим список настроек в файле settings.xml:

Обратите внимание на атрибут android:key, он нам ещё пригодится в коде.

Добавим массив строк для настроек стиля шрифта:

Теперь напишем код для фрагмента, наследующего от PreferenceFragment:

Теперь пользователь сразу видит текущую настройку стиля шрифта. Удобно же.

Открываем окно настроек из системных настроек Передача данных

Если вы зайдёте в Настройки | Передача данных и выберите свою программу, то внизу увидите неактивированную кнопку Настройки приложения. Чтобы её активировать, пропишите в манифесте у свой активности, которая отвечает за настройки, специальный фильтр MANAGE_NETWORK_USAGE:

Источник

Оцените статью