При разработке мобильного приложения возникает общая необходимость сохранения пользовательских предпочтений и их использования при запуске приложения. Так как это является постоянной потребностью, Google создала для нас структуру предпочтений. Предоставленный механизм позволяет нам очень легко показывать, сохранять и манипулировать предпочтениями пользователя. Кроме того, фреймворк поддерживает автоматическое создание пользовательского интерфейса. Я имею в виду, что, объявляя тип пользовательского предпочтения, автоматически создается пользовательский интерфейс для управления этими предпочтениями без необходимости писать однострочный код. Как это звучит для быстрой разработки приложений?
Чтобы использовать структуру предпочтений, первым шагом является расширение класса PreferenceActivity . Это просто вспомогательный класс, который наследуется от ListActivity и позволяет загружать пользовательский интерфейс настроек из файла XML. Кроме того, он автоматически сохраняет SharedPreferences за кулисами. Не забывайте, что SharedPreferences является интерфейсом, отвечающим за доступ и изменение данных о предпочтениях, и что мы можем вручную манипулировать ими, вызывая метод getSharedPreferences из Activity . Чтобы связать наш класс PreferenceActivity и файл макета XML, мы используем метод addPreferencesFromResource . Таким образом, наш метод onCreate очень прост и выглядит следующим образом:
1
2
3
4
5
6
7
|
... @Override public void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences); } ... |
Это предполагает, что мы уже создали файл с именем «preferences.xml» в папке «res / xml». Затем во время выполнения действие раздувает данный ресурс XML и добавляет иерархию предпочтений к текущей иерархии предпочтений. Этот XML-файл имеет определенный формат, с помощью которого мы определяем типы предпочтений. Все типы являются производными от класса Preference , который представляет собой базовый блок UI базовых предпочтений и предоставляет представление, отображаемое в действии, и ассоциацию с объектом SharedPreferences для хранения / извлечения данных предпочтений. Вот некоторые из наиболее распространенных подклассов, которые вы можете использовать напрямую:
- CheckBoxPreference : обеспечивает функциональность виджета флажка. Будет хранить логическое значение.
- RingtonePreference : позволяет пользователю выбрать мелодию звонка из тех, что на устройстве. URI выбранного рингтона будет сохранен в виде строки.
- EditTextPreference : позволяет вводить строки. Сохранит строку в SharedPreferences.
- ListPreference : отображает список записей в виде диалога. Это предпочтение сохранит строку в SharedPreferences .
Также имейте в виду, что различные предпочтения могут быть сгруппированы в категории с помощью класса PreferenceCategory , который группирует объекты предпочтений и предоставляет отключенный заголовок над группой.
Давайте посмотрим, из чего будет состоять наш файл декларации XML. У нас будет две категории. В первом случае у нас будет CheckBoxPreference , который будет включать или отключать обновления данных для гипотетического приложения, и ListPreference, с помощью которого мы будем определять, как часто мы хотим, чтобы обновления происходили. Как вы уже догадались, между этими двумя предпочтениями есть зависимость. Это может быть достигнуто с помощью атрибута android: dependency . Наконец, во второй категории у нас будет EditTextPreference, с помощью которого приветственное сообщение будет сохранено и показано при необходимости. Вот как выглядит XML-файл:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
<? xml version = "1.0" encoding = "utf-8" ?> < 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 определен атрибут android: records . Мы используем это для загрузки предопределенных значений, которые хранятся во внешнем XML-файле под именем «res / values / arrays.xml». Записи «updateInterval» и «updateIntervalValue» используются из этого файла. На самом деле это пары ключ-значение, поэтому фактическое значение сохраняется во втором списке. Вот как выглядит файл:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
|
<? 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 > |
Как мы объясняли, постоянная часть уравнения обрабатывается структурой. Чтобы показать вам, как читать уже сохраненные значения, мы создадим еще одно действие, которое будет запущено из нашего основного. Давайте сначала посмотрим, как выглядит основная деятельность:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
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 с помощью метода onCreateOptionsMenu . Когда пользователь выбирает конкретный элемент, мы обрабатываем его действия внутри метода onOptionsItemSelected и запускаем новое действие, используя метод startActivity . Если вы хотите узнать больше о меню опций, посмотрите мой старый учебник под названием « Использование меню опций и настраиваемых диалогов для взаимодействия с пользователем ». Более подробную информацию о начале деятельности можно найти в моем уроке « Запуск новых действий с намерениями ».
Давайте теперь создадим «ShowSettingsActivity». Во-первых, мы должны объявить его в файле манифеста Android, поэтому вот как выглядит наш файл «AndroidManifest.xml»:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
<? xml version = "1.0" encoding = "utf-8" ?> 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 > |
Вот код для самой деятельности:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
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 с помощью статического метода getDefaultSharedPreferences класса PreferenceManager . Затем, в зависимости от типа данных предпочтения, мы используем соответствующий метод получения, такой как getBoolean или getString . Обратите внимание, что вторым аргументом для них является значение по умолчанию, которое будет использоваться, если значение еще не сохранено. В качестве ключей мы используем ключи, определенные в исходном файле «preferences.xml», т.е. «execute_updates», «updates_interval» и «welcome_message». Значения объединяются и затем представляются в TextView .
Вот также простой макет для конкретной деятельности:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
<? xml version = "1.0" encoding = "utf-8" ?> < LinearLayout 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 > |
Если мы сейчас запустим конфигурацию Eclipse, мы получим экран настроек, подобный следующему:
Нажатие на «Интервал обновления» приведет к появлению списка параметров:
Аналогичным образом, щелкнув по предпочтению «Приветственное сообщение», появится текст редактирования:
Теперь давайте прочитаем уже сохраненные значения. Нажмите кнопку «Меню» на эмуляторе, чтобы появилось меню параметров, и выберите пункт «Показать текущие настройки». Это запустит наше второе действие, внутри которого значения будут прочитаны и представлены следующим образом:
Вот и все, ребята. Краткое руководство о том, как использовать инфраструктуру предпочтений, предоставляемую в SDK, для быстрой обработки пользовательских предпочтений в вашем приложении. Вы можете найти проект Eclipse, созданный в этом руководстве, здесь .
Ура!
- Серия «Android Full Tutorial»
- Повысьте разбор Android Android с помощью XML Pull
- Android-приложение для преобразования текста в речь
- Обратное геокодирование Android с помощью Yahoo API — PlaceFinder
- Приложение для определения местоположения Android — GPS местоположение
- Установите ОС Android на свой компьютер с VirtualBox