- PVSM.RU - https://www.pvsm.ru -
При разработке мобильных приложений зачастую возникает необходимость хранить настройки приложения (выбранную пользователем цветовую тему, пароль доступа к приложению, параметры синхронизации с сервером и т.д.). Поскольку такие задачи возникают довольно часто, в Google позаботились о разработчиках и создали механизм для быстрой и легкой реализации данного функционала. Этот механизм позволяет легко создавать, сохранять, отображать и производить разные манипуляции с настройками приложения. Мало того он позволяет автоматически создавать пользовательский интерфейс. При описании типа параметра настроек — автоматически генерируется часть пользовательского интерфейса в зависимости от типа параметра (boolean — чекбокс, String — поле ввода, ...) без написания кода. Звучит неплохо для быстрой разработки, не так ли?
PreferenceActivity [1]. Этот класс наследован от класса ListActivity
[2] и позволяет создавать пользовательский интерфейс по описанию в XML файле ресурсов. Мало того, этот класс позволяет автоматически сохранять настройки в SharedPreferences [3] незаметно для вас. SharedPreferences [3] — интерфейс позволяющий обращаться и манипулировать данными настройки приложения вручную с помощью вызова метода getSharedPreferences [4] из вашего Activity [5] (подробнее Android Essentials: Application Preferences [6]). Для того что бы увязать вместе наш класс унаследованный от PreferenceActivity и XML файл описывающий параметры конфигурации используется метод addPreferencesFromResource [7]:
- ...
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- addPreferencesFromResource(R.xml.preferences);
- }
- ...
Теперь необходимо создать файл res/xml/preferences.xml который является описанием нашего списка параметров конфигурации приложения и будет подхвачен нашим PreferenceActivity [1]. Этот XML файл имеет специфический формат позволяющий описывать типы параметров конфигурации. Все типы вытекают из класса Preference [8] который представляет собой базовый блок пользовательского интерфейса и генерирует View [9] которое в последствии отобразится в нужном месте пользовательского интерфейса и будет ассоциироваться с объектом SharedPreferences [3] который можно будет извлекать и сохранять. Рассмотрим часто используемые подклассы, которые используются для описание типов параметров конфигурации:
Также необходимо отметить, что отдельные параметры могут группироваться в категории с помощью класса PreferenceCategory [16], который группирует объекты Preference [8] и выводит неактивный заголовок группы.
Теперь опишем, что же мы хотим видеть в нашем XML описании. У нас будет две категории. В первой разместим CheckBoxPreference [10] который будет активировать/дезактивировать синхронизацию данных нашего гипотетического приложения и ListPreference [15] в которым будем задавать частоту синхронизации данных. Как вы уже наверняка заметили, между этими двумя параметрами есть зависимость, если первый не выбран, то второй нужно дезактивировать. Это достигается с помощью использования атрибута android:dependency [17]. Во второй категории мы разместим EditTextPreference [13] с помощью которого будем задавать текст приветствия. Представим все это в виде XML:
- <?xml version="1.0" encoding="utf-8"?>
- <PreferenceScreen xmlns:android="schemas.android.com/apk/res/android" [18]>
- <PreferenceCategory
- android:title="First Category"
- android:key="first_category">
- <CheckBoxPreference
- android:key="perform_updates"
- android:summary="Enable or disable data updates"
- android:title="Enable updates"
- android:defaultValue="true"
- />
- <ListPreference
- android:key="updates_interval"
- android:title="Updates interval"
- android:summary="Define how often updates will be performed"
- android:defaultValue="1000"
- android:entries="@array/updateInterval"
- android:entryValues="@array/updateIntervalValues"
- android:dependency="perform_updates"
- />
- </PreferenceCategory>
- <PreferenceCategory
- android:title="Second Category"
- android:key="second_category">
- <EditTextPreference
- android:key="welcome_message"
- android:title="Welcome Message"
- android:summary="Define the Welcome message to be shown"
- android:dialogTitle="Welcome Message"
- android:dialogMessage="Provide a message"
- android:defaultValue="Default welcome message" />
- </PreferenceCategory>
- </PreferenceScreen>
Заметьте, что для ListPreference [15] мы указали атрибут android:entries [19] который указывает на место хранения возможных значений списка. Эти значения хранятся в XML файле res/values/arrays.xml. Значения “updateInterval” and “updateIntervalValue” хранятся в этом файле. На самом деле это просто пары ключ-значение, ключи хранятся в первом массиве, а значения — во втором:
- <?xml version="1.0" encoding="utf-8"?>
- <resources>
- <string-array name="updateInterval">
- <item name="1000">Every 1 second</item>
- <item name="5000">Every 5 seconds</item>
- <item name="30000">Every 30 seconds</item>
- <item name="60000">Every 1 minute</item>
- <item name="300000">Every 5 minutes</item>
- </string-array>
- <string-array name="updateIntervalValues">
- <item name="1000">1000</item>
- <item name="5000">5000</item>
- <item name="30000">30000</item>
- <item name="60000">60000</item>
- <item name="300000">300000</item>
- </string-array>
- </resources>
Добавлю еще один полезный момент, который может пригодиться. Очень часто необходимо ограничить доступ к приложению с помощью пароля или PIN кода который задается в конфигурации приложения. Очевидно что для этих целей используется EditTextPreference [13]. Но было бы неплохо в случае пароля или PIN-кода скрывать введенные символы, а для кода еще и ограничить ввод только цифрами. Для этого можно использовать атрибуты android:password [20] и android:inputType [21] соответственно:
- <EditTextPreference
- android:key="pin"
- android:title="PIN code"
- android:summary="If login screen is enabled"
- android:dialogTitle="PIN code"
- android:dialogMessage="Provide a PIN"
- android:defaultValue=""
- android:inputType="number"
- android:password="true"
- android:dependency="runLoginScreen"
- />
Как говорилось выше, основную часть работы берет на себя сам andriod-фреймворк. Для того чтобы показать как читать уже заданные параметры мы создадим еще одну активность экрана, которая будет запускаться из нашей главной активности. Но вначале посмотрим на код главной:
- package com.javacodegeeks.android.preferences;
- import android.content.Intent;
- import android.os.Bundle;
- import android.preference.PreferenceActivity;
- import android.view.Menu;
- import android.view.MenuItem;
- public class QuickPrefsActivity extends PreferenceActivity {
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- addPreferencesFromResource(R.xml.preferences);
- }
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- menu.add(Menu.NONE, 0, 0, "Show current settings");
- return super.onCreateOptionsMenu(menu);
- }
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case 0:
- startActivity(new Intent(this, ShowSettingsActivity.class));
- return true;
- }
- return false;
- }
- }
Мы создали опционное меню с одним элементом MenuItem [22] с помощью метода onCreateOptionsMenu [23]. Когда пользователь кликает на элемент меню, мы обрабатываем это событие в методе onOptionsItemSelected [24] и запускаем новую активность используя метод startActivity [25]. (подробнее Using options menus and customized dialogs for user interaction [26], Launching new activities with intents [27]).
Теперь создадим вторую активность ShowSettingsActivity для отображения параметров конфигурации приложения. Но вначале мы должны описать новую активность в manifest файле AndroidManifest.xml:
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="schemas.android.com/apk/res/android" [18]
- package="com.javacodegeeks.android.preferences"
- android:versionCode="1"
- android:versionName="1.0">
- <application android:icon="@drawable/icon" android:label="@string/app_name">
- <activity android:name=".QuickPrefsActivity" android:label="@string/app_name">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- <activity android:name=".ShowSettingsActivity" />
- </application>
- <uses-sdk android:minSdkVersion="3" />
- </manifest>
Код второй активности выглядит так:
- package com.javacodegeeks.android.preferences;
- import android.app.Activity;
- import android.content.SharedPreferences;
- import android.os.Bundle;
- import android.preference.PreferenceManager;
- import android.widget.TextView;
- public class ShowSettingsActivity extends Activity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.show_settings_layout);
- SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
- StringBuilder builder = new StringBuilder();
- builder.append("n" + sharedPrefs.getBoolean("perform_updates", false));
- builder.append("n" + sharedPrefs.getString("updates_interval", "-1"));
- builder.append("n" + sharedPrefs.getString("welcome_message", "NULL"));
- TextView settingsTextView = (TextView) findViewById(R.id.settings_text_view);
- settingsTextView.setText(builder.toString());
- }
- }
Здесь мы извлекаем параметры конфигурации приложения в виде класса SharedPreferences [3] с помощью статического метода getDefaultSharedPreferences [28] класса PreferenceManager [29]. Далее, в зависимости от типа данных параметра, мы используем соответствующий метод извлечения данных (например getBoolean [30] или getString [31]). Второй аргумент в методе извлечения данных — значение по умолчанию, на тот случай если параметр с таким именем еще не был задан. В качестве имен параметров мы используем ключи заданные в XML файле preferences.xml. Значения параметров конкатенируются и выводятся в TextView [32].
Вот описание простого пользовательского интерфейса для второй активности:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout
- xmlns:android="schemas.android.com/apk/res/android" [18]
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <TextView
- android:id="@+id/settings_text_view"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- />
- </LinearLayout>
Давайте запустим приложение, мы увидим список наших параметров:
Кликаем на “Updates Interval” и видим список возможных значений:
Кликаем на “Welcome Message” и видим редактирование текста приветствия:
Посмотрим на заданные параметры. Кликнете на кнопке меню и выберете единственный элемент “Show current settings”. Запуститься вторая активность в которой мы увидим значения наших параметров конфигурации:
Это все. Как видите, это действительно просто. Удачи!
Оригинал: Android Quick Preferences Tutorial [33]
Автор: dzarezenko
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/andorid/2965
Ссылки в тексте:
[1] PreferenceActivity: http://developer.android.com/reference/android/preference/PreferenceActivity.html
[2] ListActivity
: http://developer.android.com/reference/android/app/ListActivity.html
[3] SharedPreferences: http://developer.android.com/reference/android/content/SharedPreferences.html
[4] getSharedPreferences: http://developer.android.com/reference/android/content/Context.html#getSharedPreferences%28java.lang.String,%20int%29
[5] Activity: http://developer.android.com/reference/android/app/Activity.html
[6] Android Essentials: Application Preferences: http://mobile.tutsplus.com/tutorials/android/android-application-preferences/
[7] addPreferencesFromResource: http://developer.android.com/reference/android/preference/PreferenceActivity.html#addPreferencesFromResource%28int%29
[8] Preference: http://developer.android.com/reference/android/preference/Preference.html
[9] View: http://developer.android.com/reference/android/view/View.html
[10] CheckBoxPreference: http://developer.android.com/reference/android/preference/CheckBoxPreference.html
[11] boolean: http://www.google.com.ua/url?sa=t&rct=j&q=java%20boolean&source=web&cd=1&ved=0CC4QFjAA&url=http%3A%2F%2Fdocs.oracle.com%2Fjavase%2F1.4.2%2Fdocs%2Fapi%2Fjava%2Flang%2FBoolean.html&ei=SutRT4HOIoK08QOJq_3vBQ&usg=AFQjCNEItnyiARRHW-iORD1RYAqUjixjWg
[12] RingtonePreference: http://developer.android.com/reference/android/preference/RingtonePreference.html
[13] EditTextPreference: http://developer.android.com/reference/android/preference/EditTextPreference.html
[14] String: http://www.google.com.ua/url?sa=t&rct=j&q=java%20string&source=web&cd=1&ved=0CDcQFjAA&url=http%3A%2F%2Fdocs.oracle.com%2Fjavase%2F6%2Fdocs%2Fapi%2Fjava%2Flang%2FString.html&ei=D-tRT97IJcie8gPYg-DvBQ&usg=AFQjCNGrFpLCfU6By2h_hQEglavyHN-E1w
[15] ListPreference: http://developer.android.com/reference/android/preference/ListPreference.html
[16] PreferenceCategory: http://developer.android.com/reference/android/preference/PreferenceCategory.html
[17] android:dependency: http://developer.android.com/reference/android/preference/Preference.html#attr_android:dependency
[18] schemas.android.com/apk/res/android": http://schemas.android.com/apk/res/android"
[19] android:entries: http://developer.android.com/reference/android/preference/ListPreference.html#attr_android:entries
[20] android:password: http://developer.android.com/reference/android/widget/TextView.html#attr_android:password
[21] android:inputType: http://developer.android.com/reference/android/widget/TextView.html#attr_android:inputType
[22] MenuItem: http://developer.android.com/reference/android/view/MenuItem.html
[23] onCreateOptionsMenu: http://developer.android.com/reference/android/app/Activity.html#onCreateOptionsMenu%28android.view.Menu%29
[24] onOptionsItemSelected: http://developer.android.com/reference/android/app/Activity.html#onOptionsItemSelected%28android.view.MenuItem%29
[25] startActivity: http://developer.android.com/reference/android/app/Activity.html#startActivity%28android.content.Intent%29
[26] Using options menus and customized dialogs for user interaction: http://www.javacodegeeks.com/2010/12/android-full-app-part-7-options-menus.html
[27] Launching new activities with intents: http://www.javacodegeeks.com/2010/11/android-full-app-part-5-launch-activity.html
[28] getDefaultSharedPreferences: http://developer.android.com/reference/android/preference/PreferenceManager.html#getDefaultSharedPreferences%28android.content.Context%29
[29] PreferenceManager: http://developer.android.com/reference/android/preference/PreferenceManager.html
[30] getBoolean: http://developer.android.com/reference/android/content/SharedPreferences.html#getBoolean%28java.lang.String,%20boolean%29
[31] getString: http://developer.android.com/reference/android/content/SharedPreferences.html#getString%28java.lang.String,%20java.lang.String%29
[32] TextView: http://developer.android.com/reference/android/widget/TextView.html
[33] Android Quick Preferences Tutorial: http://www.javacodegeeks.com/2011/01/android-quick-preferences-tutorial.html
Нажмите здесь для печати.