Статьи

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

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

Сегодня мы поговорим о диалогах, для чего они могут быть использованы, и как они создаются и используются. Затем мы пройдем этапы реализации основного диалога в классе Activity от начала до конца. Мы продолжим изучение этого руководства с некоторыми рецептами QuickTut для различных типов диалогов, которые вы, возможно, захотите использовать в своих типичных приложениях для Android. Но сначала вам нужно понять жизненный цикл диалогового окна «Активность».

Класс Android Dialog (android.app.Dialog) является базовым классом для всех типов диалоговых элементов управления, которые вы можете использовать в своих классах Activity. Диалоги живут в течение жизненного цикла вашей Активности (android.app.Activity). Они всплывают на переднем плане, блокируя экран «Активность», чтобы привлечь внимание пользователя по разным причинам.

Примечание о перспективности ваших приложений и создании приложений с поддержкой фрагментов . В этом руководстве будет использоваться традиционный метод управления основными диалогами в рамках простого упражнения. Некоторые из этих методов недавно устарели. В документации по Android SDK теперь рекомендуется, чтобы, если вы хотите использовать диалоги, вам следует установить библиотеку совместимости и использовать вместо нее класс DialogFragment. После того, как вы освоите основы жизненного цикла Dialog, вы также захотите проверить класс DialogFragment (android.app.DialogFragment). Однако этот подход выходит за рамки этого базового диалогового обсуждения, поскольку требует установки и использования библиотеки совместимости для поддержки диалогов в более старых версиях Android SDK (об этом мы расскажем в следующем уроке). Хотя методы, которые мы здесь обсуждаем, перечислены как устаревшие, новый способ создания диалогов не был представлен до Honeycomb, поэтому это решение будет продолжать нормально работать на всех устройствах.

Диалоги полезны, когда вы хотите:

  • Сообщите пользователю о каком-либо событии или прогрессе (например, «У вас есть почта!» Или «Загрузка сообщения 1 из 200 000»)
  • Заставьте пользователя подтвердить действие (например, «Вы уверены, что хотите удалить все свои контакты? Действительно уверены?»)
  • Запрашивайте у пользователя дополнительную информацию и собирайте ее (например, «Пожалуйста, введите ваше имя пользователя и пароль».)

Примечание к сообщениям Toast . Некоторые разработчики также используют сообщения Toast (android.widget.Toast) для отправки простых уведомлений или сообщений пользователю. Сообщение «Тост» отображается на экране активности в течение нескольких секунд, а затем автоматически исчезает. Пользователь не имеет возможности взаимодействовать с сообщением Toast. Нам нравится думать, что разделительная линия между тем, когда следует использовать тост над диалогом, выглядит следующим образом: если пользователь информируется о несущественной информации, используйте тост, но когда представляемая информация является жизненно важной, используйте диалог. Мы используем тосты как очень легкие информационные уведомления. Любая информация, которую вы хотите убедиться в том, что пользователь подтверждает, должна отображаться в диалоге, который требует его активного участия для отклонения.

Пример сообщения Toast показан ниже:

Тост сообщение

Диалоги имеют ряд различных компонентов, большинство из которых являются необязательными. Базовый диалог имеет:

  • Заголовок
  • Сообщение
  • Кнопки для сбора ответов пользователей (например, Да, Нет, Отмена и т. Д.)

Общая конфигурация диалога показана ниже:

Общий диалог

Вы также можете создавать собственные элементы управления диалоговым окном, где вы управляете макетом в области диалогового окна. Таким способом вы можете создавать сложные диалоги, в том числе те, которые получают ввод от пользователя, используя другие элементы управления Android, такие как EditText, Spinner и другие.

Пользовательская конфигурация диалога:

Пользовательский пароль Диалог

Теперь давайте поговорим о том, как диалоги управляются вашим классом Activity. Начнем с основных фактов:

  • Диалог принадлежит Деятельности и управляется этим Мероприятием.
  • Деятельность может иметь один или несколько диалогов. Каждый диалог имеет свой уникальный идентификатор.
  • Деятельность сохраняет пул диалогов.
  • По умолчанию диалоговое окно будет повторно использовано, если будет предложено отобразить снова.
  • Activity может отображать определенный диалог по его идентификатору с помощью метода showDialog ().
  • Деятельность может прекратить отображение определенного диалога по его идентификатору с помощью метода dismissDialog (). Этот диалог останется в пуле действий, чтобы при необходимости использовать его снова.
  • Деятельность может удалить определенный диалог из своего пула по идентификатору диалога с помощью метода removeDialog (). Если этот диалог отображается снова, он должен быть создан с нуля.

Итак, как вы создаете базовый диалог для вашего класса деятельности? Вы просто определяете, создаете и инициализируете его как часть своей деятельности. Давайте посмотрим на простой пример.

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

Теперь давайте добавим три новых диалога в ваш базовый класс Activity.

Отредактируйте ваш класс Java Activity и добавьте следующие переменные-члены:

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

Чтобы создать экземпляры Dialog, вы должны реализовать метод onCreateDialog () вашего класса Activity. Когда вызывается метод showDialog (), он инициирует вызов этого метода, который должен вернуть соответствующий экземпляр Dialog. Поскольку в нашем классе будет три разных диалога, нам нужно будет проверить входящий идентификатор диалога и использовать переключатель, чтобы вернуть диалог соответствующего типа.

Самый простой из элементов управления Dialog (MY_SUPER_SIMPLE_DIALOG_ID), как показано на рисунке 4, просто показывает текстовое название. У него нет кнопок. Единственный способ отменить это — нажать кнопку «Назад». Вы не видите этот вид диалога очень часто, так как у большинства есть по крайней мере кнопка ОК, чтобы закрыть его. Этот диалог может быть создан путем создания экземпляра класса Dialog и установки заголовка Dialog с помощью метода setTitle ().

Диалог действительно голый

Наиболее распространенный элемент управления Dialog (MY_ SIMPLE_DIALOG_ID), показанный ниже, показывает текстовый заголовок со значком и сообщением. У него есть одна кнопка — ОК. Это AlertDialog, который можно легко создать с помощью класса AlertDialog.Builder. В этом случае вы используете методы setTitle (), setMessage (), setIcon () и setPositiveButton () для настройки кнопки по желанию.

Основной AlertDialog с кнопкой ОК

Другие общие элементы управления Dialog (MY_DIALOG_ID), показанные на следующем рисунке, показывают текстовое название со значком и настраиваемое сообщение. Имеет две кнопки — ОК и Отмена. Это еще один AlertDialog, который можно создать с помощью класса AlertDialog.Builder. В этом случае вы используете методы setTitle (), setMessage (), setIcon, setPositiveButton () и setNegativeButton () для настройки кнопки по желанию.

Настраиваемый диалог AlertDialog с кнопками ОК и Отмена

Полная реализация метода onCreateDialog (), который показывает создание всех трех типов Dialog, рассмотренных выше, показана здесь:

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
43
44
45
46
47
@Override
protected Dialog onCreateDialog(int id) {
    switch (id) {
    case MY_SUPER_SIMPLE_DIALOG_ID:
        Dialog superSimpleDlg = new Dialog(this);
        superSimpleDlg.setTitle(R.string.dialog_title);
        return superSimpleDlg;
 
    case MY_SIMPLE_DIALOG_ID:
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle(R.string.dialog_title);
        builder.setMessage(R.string.dialog_message);
        builder.setIcon(android.R.drawable.btn_star);
builder.setPositiveButton(android.R.string.ok, new
DialogInterface.OnClickListener() {
                  public void onClick(DialogInterface dialog, int which) {
                        Toast.makeText(getApplicationContext(),
«Clicked OK!», Toast.LENGTH_SHORT).show();
                      return;
                } });
        return builder.create();
 
    case MY_DIALOG_ID:
        AlertDialog.Builder builder2 = new AlertDialog.Builder(this);
        builder2.setTitle(R.string.dialog_title);
        builder2.setIcon(android.R.drawable.btn_star);
        builder2.setMessage(«»);
        builder2.setPositiveButton(android.R.string.ok, new
DialogInterface.OnClickListener() {
                  public void onClick(DialogInterface dialog, int which) {
                        Toast.makeText(getApplicationContext(),
«Clicked OK!», Toast.LENGTH_SHORT).show();
                      return;
                } });
 
        builder2.setNegativeButton(android.R.string.cancel, new
DialogInterface.OnClickListener() {
                  public void onClick(DialogInterface dialog, int which) {
                        Toast.makeText(getApplicationContext(),
«Clicked Cancel!», Toast.LENGTH_SHORT).show();
                      return;
                } });
             
        return builder2.create();
    }
    return null;
}

Напомним, что Activity сохраняет диалоги и использует их всякий раз, когда они отображаются. Некоторые диалоги, такие как наши первые два примера (MY_SUPER_SIMPLE_DIALOG_ID и MY _SIMPLE_DIALOG_ID), имеют статическое содержимое, поэтому их многократное отображение не является проблемой. В этом случае вы можете выполнить все настройки Dialog в методе onCreateDialog ().

Тем не менее, наш третий пример диалога (MY_DIALOG_ID) содержит настраиваемое сообщение, которое должно обновляться каждый раз, когда отображается диалоговое окно для отображения текущей даты и времени, когда диалог запрашивался. Если вы настроили сообщение для этого диалога в методе onCreateDialog (), оно всегда будет показывать это время.

Каждый раз, когда запрашивается диалог, вы получаете возможность обновить его содержимое с помощью метода onPrepareDialog (). Мы можем использовать эту возможность, чтобы обновить сообщение нашего Диалога новым содержанием.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
@Override
protected void onPrepareDialog(int id, Dialog dialog) {
    super.onPrepareDialog(id, dialog);
    switch (id) {
    case MY_SUPER_SIMPLE_DIALOG_ID:
        // Static dialog contents.
        break;
    case MY_SIMPLE_DIALOG_ID:
        // Static dialog contents.
        break;
    case MY_DIALOG_ID:
        // Some initialization needed.
            AlertDialog myDialog = (AlertDialog) dialog;
                SimpleDateFormat dFormat = new SimpleDateFormat(
«yyyy-MM-dd HH:mm:ss»,
            Locale.getDefault());
                myDialog.setMessage(«This dialog was launched at » +
            dFormat.format(mCurrentTime));
        break;
    }
    return;
}

Обратите внимание, что mCurrentTime является переменной-членом, которую мы устанавливаем каждый раз, когда запускается диалог. Смотрите полный исходный код для полного примера того, как это работает.

Наконец, вы готовы к запуску элементов управления Dialog для отображения по мере необходимости. Для нашего очень простого тестового приложения мы используем нажатие одной кнопки, чтобы запустить один из трех созданных нами диалогов, в зависимости от текущего времени. Обработчик нажатия для нашего элемента управления Button, как определено в классе Activity, выглядит следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
public void onDialogButtonClick(View v) {
 
    Date dt = new Date();
    if (dt.getSeconds() % 3 == 0) {
        showDialog(MY_SUPER_SIMPLE_DIALOG_ID);
    } else if (dt.getSeconds() % 3 == 1) {
        showDialog(MY_SIMPLE_DIALOG_ID);
    } else {
        mCurrentTime = dt;
        showDialog(MY_DIALOG_ID);
    }
}

Это все, что вам нужно для запуска диалогов в вашем классе Activity. Нажмите на кнопку пару раз, чтобы увидеть различные типы определенных вами элементов управления Dialog.

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

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

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