Android Preference Framework
Настройките могат да бъдат скрити или публични. Например, можем да преброим колко пъти даден потребител е стартирал нашата програма и да му дадем бонус при 100-то стартиране. Ние съхраняваме брояча за стартиране на приложението във файла с настройки, но потребителят не знае нищо за него. Но се случва, че трябва да позволим на потребителя да персонализира функционалността на приложението според вкуса си. Например, направете настройката „Напомняне за рождения ден на котката“. Ако потребителят провери тази настройка (нека просто се опита да не я маркира), програмата ще му напомни в точния ден да купи торта.
Често за тези цели приложенията използват отделен екран с настройки. Разбира се, можете да създадете свой собствен xml файл за маркиране и да поставите необходимите контроли там. Но Android предоставя своя собственаPreferences Frameworkза тези цели, с която можете да създадете индивидуален набор от предпочитания и да ги вградите в приложения. Основното предимство на използването на рамката е, че екранът с настройки изглежда стандартен във всички приложения и позволява на потребителя бързо да разбере работата.
Освен това рамката на предпочитанията ви позволява да слушате за промени в споделените предпочитания чрез внедряването на метода onSharedPreferenceChangeListener().
Използването на рамката ви позволява бързо да създадете екран с настройки с малко или никакво кодиране. Предпочитанията са отделна дейност в приложението, извикана от вашата дейност. Самата дейност с предпочитания се простира от класаPreferenceActivity, а не от стандартния класActivity. Предпочитанията се дефинират в отделен XML файл, където основният елемент е element
Трябва да изградите своя екран с настройки, като използвате готови компоненти.
За съхраняване на предпочитанията се използват различни класове:
Елементите имат задължителни атрибути в допълнение към собствените си атрибути:
- android:key - ключът, чрез който може да се определи стойността
- android:title - кратък текст на настройката
- android:summary - дълго описание на настройката. Показва се под краткия текст с по-малък шрифт
- android:defaultValue - стойността по подразбиране, която да се използва, ако нищо не е избрано
CheckBoxPreference
Задайте настройките в създадения файл. Нека започнем сCheckBoxPreference.
Дефинирали сме две настройки за програмата:
- включване и изключване на Wi-Fi
- показване на съвети
В нашия случай показваме квадратчета за отметка (елементът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. Необходимо е предварително да се подготви низов ресурс за заглавката и масив от низове за самия списък със стойности. Индексът на избрания ред от списъка ще зададе желаната стойност за запазваневСподелени предпочитания.
Нека добавим списък за избор на стила на текста. В списъка ще има четири опции: Normal, Bold, Italic, Bold+Italic.
Нека подготвим масив от низове и да го запазим във файлаarrays.xml, който трябва да бъде поставен в директориятаres/values/.
Нека добавим допълнителен елемент към файла с настройкиsettings.xml, в който дефинираме атрибутите на заглавието на прозореца, обвързването към масива от стойности и стойността по подразбиране:
Кодът за четене на настройки от списъка е разгледан в следващия урок.
Когато стартирате проекта, вече ще видите нова настройкаFont Style, която отваря диалогов прозорец, за да изберете стил от списък. Обърнете внимание, че в диалоговия прозорец няма бутон за запазване, а самоОтказ. Промените се запазват незабавно, когато изберете опцията за списък.
SwitchPreference
След като разберете общия принцип, можете сами да се справите с други елементи на настройките. Помислете за още един елемент -SwitchPreference, който е заместител наCheckBoxPreferenceи ви позволява да активирате или деактивирате настройката.
В резултат на това получаваме:
В зависимост от избраната опция, можем да променим текста на настройката чрез атрибутитеsummaryOn/summaryOff.
Предпочитание за мелодия
Помислете за работа с настройките, свързани с настройката на мелодията за повикване. Предпочитанието предоставя диалогов прозорец за избор на мелодия със списък с опции. Списъкът в диалоговия прозорец показва тоновете на звънене, известията, тоналното набиране, налични на мобилното устройство. Също така е възможно да добавите допълнителна опция "Silent" (Тих режим) - добавете атрибутandro.
Нека създадем нов файл с настройкиres/xml/ringtone_preference.xml:
Да творимнова дейност за предпочитания за мелодияRingtonePreferenceActivity, като повторите стъпките от предишния пример. Да започнем създадената дейност.
PreferenceCategory
Категориите се добавят чрез елемент
Ако погледнете екрана с настройки, ще видите допълнителна лента с текст „Настройки на шрифта“.
PreferenceScreen
Освен коренния елемент
Когато стартирате приложението, ще видите нова настройкаЦвят на текста, която отваря нов прозорец за избор на цвят на текста.
Импортиране на системни настройки
Рамката за настройки има интересна функция - можете да вградите извикване на системни настройки в екрана с настройки на вашето приложение. Това става по следния начин. Добавете нов блок към файла с настройки, например този:
Класътandroid.provider.Settingsвключва много константи катоandroid.settings.*, които могат да се използват за извикване на екраните за системни настройки. Избрах настройката Офлайн, можете също да извикате настройката за дисплей (android.settings.DISPLAY_SETTINGS). На екрана с настройки ще се появи нов елемент, който автоматично ще работи при щракване.
Когато използва този метод, системата интерпретира това като заявка за извикване на методаstartActivity()с определената дейност. Това е много удобно, когато трябва да извикате стандартна системна настройка от екрана с настройки.
Настройки със зависимости
Понякога се изисква част от настройките да бъдат свързани с конкретна родителска настройка. И ако родителската настройка е блокирана, тогава има смисъл автоматично да блокирате и детските настройки. За тази цел се използва атрибутътandroid:dependency.
Посочили сме, че текстовото полезависи от квадратчето за родителска отметка. Нека стартираме и сравним поведението в два различни случая.
Проследете промените в Общи настройки
Както вече беше споменато, класътonSharedPreferenceChangeListenerви позволява да извиквате метод за обратно извикване по време на добавяне, премахване или промяна на конкретно споделено предпочитание. Използвайки този манипулатор, компонентите на вашето приложение могат да слушат за промени в настройките, зададени от потребителя, и да актуализират потребителския интерфейс или да коригират поведението на програмата.
Регистрирайте манипулатораOnSharedPreferenceChangeListenerсъс споделените предпочитания, които искате да наблюдавате. Изпълнението наonSharedPreferenceChanged()е показано по-долу (wireframe):