Статьи

Дизайн пользовательского интерфейса Android: создание экранов настроек приложения

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

Наше простое приложение для чтения фидов обучающей программы Mobiletuts, которое еще не имеет официального названия (мы называем его TutList), нуждается в улучшенном пользовательском контроле процесса фонового обновления. Поэтому мы добавим одну настройку, чтобы помочь контролировать фоновое обновление.

Этот учебник основан на предыдущих учебниках, включая Android Essentials: настройки приложений и продолжение серии наших мероприятий TutList с последним учебником « Основы Android: планирование повторяющихся задач» . Если у вас возникли проблемы со сном, не стесняйтесь задавать вопросы в разделе комментариев — многие читают и отвечают, в том числе и мы сами. Кроме того, не забудьте о справочнике по Android SDK .
Окончательный пример кода, прилагаемый к этому учебному пособию, доступен для загрузки с открытым исходным кодом с хостинга кодов Google .

В этом учебном пособии предполагается, что вы начнете с того места, где предыдущий учебник из серии «Основы Android: планирование повторяющихся задач» был прекращен. Вы можете скачать этот код и работать оттуда, или вы можете скачать код для этого урока и следовать. В любом случае, будьте готовы, загрузив один или другой проект и импортировав его в Eclipse.

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

Давайте начнем с кода вспомогательного класса:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
public class TutListSharedPrefs {
    public final static String PREFS_NAME = «tutlist_prefs»;
 
    public static boolean getBackgroundUpdateFlag(Context context) {
        SharedPreferences prefs = context.getSharedPreferences(PREFS_NAME, 0);
        return prefs.getBoolean(
                context.getString(R.string.pref_key_flag_background_update),
                false);
    }
 
    public static void setBackgroundUpdateFlag(Context context, boolean newValue) {
        SharedPreferences prefs = context.getSharedPreferences(PREFS_NAME, 0);
        Editor prefsEditor = prefs.edit();
        prefsEditor.putBoolean(
                context.getString(R.string.pref_key_flag_background_update),
                newValue);
        prefsEditor.commit();
    }
}

В этом классе мы определили общедоступную константу для идентификации имени группы или набора настроек, которая называется PREFS_NAME. Мы также использовали строку ресурса, называемую pref_key_flag_background_update, чтобы указать конкретное определение имени предпочтения. Вы должны добавить строку в ваши ресурсы, чтобы этот идентификатор был определен. Мы устанавливаем его значение «background_update_flag», но важно то, что используемое значение везде одинаково.

Хотя мы добавили метод setBackgroundUpdateFlag () для полноты, мы не будем использовать этот метод. Читайте дальше, чтобы понять почему.

Наконец, мы добавили этот класс Java в пакет com.mamlambo.tutorial.tutlist.data, так как это представляется наиболее актуальным.

Android SDK включает в себя последовательные средства представления настроек пользователям: PreferenceActivity. В сочетании с файлом ресурсов настроек этот специализированный класс Activity позволяет разработчикам очень легко настраивать и отображать большинство типов параметров приложения согласованным образом. Согласованность с другими экранами приложений и системных настроек также делает эти экраны знакомыми и удобными для пользователей.

Чтобы добавить PreferenceActivity в приложение «TutList», начните с добавления нового вызова активности TutListPreferencesActivity и попросите его расширить PreferenceActivity (мы добавили его в основной пакет). Поскольку мы не используем имя предпочтения по умолчанию, нам нужно установить имя предпочтения, которое будет использовать этот PreferenceActivity. Кроме того, нам нужно указать, какой файл ресурсов предпочтений использовать. Это скажет ему, как отобразить настройки, а также какие из них отображает и изменяет этот экран.

В методе onCreate () этого действия используйте метод setSharedPreferencesName () с константой группы предпочтений, определенной в классе помощников предпочтений, который мы определили на предыдущем шаге. Затем сделайте вызов метода addPreferencesFromResource (). Мы определим этот ресурс на следующем шаге.

Прямо сейчас весь этот класс выглядит так:

01
02
03
04
05
06
07
08
09
10
public class TutListPreferencesActivity extends PreferenceActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
 
        getPreferenceManager().setSharedPreferencesName(
                TutListSharedPrefs.PREFS_NAME);
        addPreferencesFromResource(R.xml.prefs);
    }
}

Мы будем совершенствовать этот класс на протяжении всего урока. Но сначала давайте создадим ссылочный ресурс XML с именем prefs.

Добавьте новый файл XML с именем prefs.xml к ресурсам приложения. Вы можете использовать новый мастер XML-файлов Android и заполнить поля, как показано на следующем рисунке. Это также создаст файл XML в правильном месте, в каталоге / res / xml.

Файл ресурсов действия предпочтений состоит из тега <PreferencesScreen> с одним или несколькими тегами <PreferenceCategory> для организации настроек и различных атрибутов, зависящих от типа. Для наших простых потребностей предпочтений мы можем использовать <CheckBoxPreference>, который загружает и сохраняет логическое значение. Другие возможные типы включают выбор EditTextPreference и ListPreference для сбора строк и выбора из списка элементов соответственно.

Вот весь файл ресурсов экрана настроек содержимого, prefs.xml:

01
02
03
04
05
06
07
08
09
10
11
<?xml version=»1.0″ encoding=»utf-8″?>
<PreferenceScreen
    xmlns:android=»http://schemas.android.com/apk/res/android»>
    <PreferenceCategory
        android:title=»Background Updating»>
        <CheckBoxPreference
            android:summary=»@string/pref_summary_background_update_flag»
            android:title=»@string/pref_title_background_update_flag»
            android:key=»@string/pref_key_flag_background_update» />
    </PreferenceCategory>
</PreferenceScreen>

Это демонстрирует одну из лучших причин хранить ключевые строки в качестве ресурса: они могут использоваться непосредственно в файле XML, а также загружаться в Java.

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

Для этого сначала отредактируйте файл ресурса /res/menu/options_menu.xml, чтобы добавить новый пункт меню:

1
2
3
4
<item
    android:id=»@+id/settings_option_item»
    android:icon=»@drawable/ic_menu_preferences»
    android:title=»@string/settings»></item>

Вам также необходимо добавить соответствующую строку ресурса для заголовка элемента (@ string / settings) и добавить соответствующий значок (@ drawable / ic_menu_preferences). Мы использовали стандартный значок настроек из Android SDK, который будет знаком пользователям.

Затем отредактируйте метод onCreateOptionsMenu (), чтобы указать правильное намерение для нового пункта меню:

1
2
3
4
5
Intent prefsIntent = new Intent(getActivity().getApplicationContext(),
        TutListPreferencesActivity.class);
 
MenuItem preferences = menu.findItem(R.id.settings_option_item);
preferences.setIntent(prefsIntent);

Теперь обновите метод onOptionsItemSelected (). Поскольку существует более одного пункта меню, теперь имеет смысл использовать оператор switch. В операторе switch мы можем использовать постоянные идентификаторы, назначенные для каждого пункта меню, чтобы дифференцировать выбор пользователя.

01
02
03
04
05
06
07
08
09
10
11
12
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.refresh_option_item:
        getActivity().startService(item.getIntent());
        break;
    case R.id.settings_option_item:
        getActivity().startActivity(item.getIntent());
        break;
    }
    return true;
}

Наконец, не забудьте добавить новое действие в файл манифеста Android:

1
2
<activity
    android:name=».TutListPreferencesActivity» />

Теперь вы можете запустить приложение и увидеть новый пункт меню.

Активность настроек можно запускать, сохранять и извлекать настройки фонового обновления. Это должно выглядеть следующим образом:

Выглядит отлично, но пока ничего не делает. Хотя флаг обновляется в настройках, еще нет места, где проверяется значение, чтобы увидеть, должно ли начаться фоновое обновление или нет ..

На последнем шаге были удалены вызовы вспомогательного метода setRecurringAlarm (). Фактически, этот метод больше не понадобится в классе TutListFragment. Вместо этого переместите его в класс TutListPreferencesActivity. Затем добавьте второго помощника с именем cancelRecurringAlarm ():

1
2
3
4
5
6
7
private void cancelRecurringAlarm(Context context) {
    Intent downloader = new Intent(context, AlarmReceiver.class);
    PendingIntent recurringDownload = PendingIntent.getBroadcast(context,
            0, downloader, PendingIntent.FLAG_CANCEL_CURRENT);
    AlarmManager alarms = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    alarms.cancel(recurringDownload);
}

Наконец, переопределите метод onPause () класса TutListPreferencesActivity, чтобы при необходимости установить или отменить повторяющийся сигнал тревоги. В этом методе вы можете проверить значение предпочтений — обновленные значения с помощью вспомогательного метода getBackgroundUpdateFlag () и вызвать соответствующий метод:

01
02
03
04
05
06
07
08
09
10
@Override
protected void onPause() {
    super.onPause();
    Context context = getApplicationContext();
    if (TutListSharedPrefs.getBackgroundUpdateFlag(getApplicationContext())) {
        setRecurringAlarm(context);
    } else {
        cancelRecurringAlarm(context);
    }
}

Теперь, когда настройки проверяются, сигнал тревоги обновляется на основе текущего значения. При значении по умолчанию «off» пользователь должен войти в настройки, чтобы включить фоновую загрузку.

Возможно, вы удивились, почему мы не использовали новый класс PreferenceFragment. Причина проста: она еще не поддерживается в библиотеке совместимости. Поскольку мы хотим, чтобы приложение TutList было совместимо не только с устройствами Android 3.0, мы пока не можем его использовать. Надеемся, что библиотека совместимости будет продолжать улучшаться.

Из этого руководства вы узнали, как использовать файл ресурсов PreferencesScreen с функцией PreferencesActivity, чтобы быстро и легко создать функциональное действие, предназначенное для управления данными предпочтений приложения. Кроме того, вы предоставили пользователю метод управления фоновым обновлением приложения TutList.
Как всегда, мы с нетерпением ждем ваших отзывов.

Разработчики мобильных приложений Лорен Дарси и Шейн Кондер являются соавторами нескольких книг по разработке Android: углубленная книга по программированию под названием « Разработка беспроводных приложений для Android» и « Самс научи себя разрабатывать приложения для Android за 24 часа» . Когда они не пишут, они тратят свое время на разработку мобильного программного обеспечения в своей компании и оказание консультационных услуг. С ними можно связаться по электронной почте [email protected] , через их блог на androidbook.blogspot.com и в Twitter @androidwireless .

Купить Android-разработку беспроводных приложений, 2-е издание Купить Sam's Teach Yourself для Android-разработки приложений в течение 24 часов Код Мамламбо в Код-Каньоне