Перейти к содержимому

Как создать диалоговое окно

  • автор:

Диалоговые окна

Начиная с Android 3.0, работа с диалоговыми окнами чуть изменилась. С тех пор статья не переписывалась и могла морально устареть.

Общая информация

В некоторых случаях требуется показать диалоговое окно, где пользователю нужно сделать какой-нибудь выбор или показать сообщение об ошибке. Безусловно, можно создать собственное окно, расположить в нем нужные кнопки и обрабатывать их нажатия. Но, в Android уже есть собственные встроенные диалоговые окна, которые гибко настраиваются под задачи. Использование диалоговых окон для простых задач позволяет сократить число классов Activity в приложении, экономя ресурсы памяти. Ведь вам не придётся регистрировать активность в манифесте, думать над компоновкой элементов на экране и так далее.

Диалоговые окна в Android представляют собой полупрозрачные «плавающие» активности, частично перекрывающие родительский экран, из которого их вызвали. Как правило, они затеняют родительскую активность позади себя с помощью фильтров размывания или затемнения. Вы можете установить заголовок с помощью метода setTitle() и содержимое с помощью метода setContentView().

Android поддерживает следующие типы диалоговых окон:

  • Dialog — базовый класс для всех типов диалоговых окон;
  • AlertDialog — диалоговое окно с кнопками, списком, флажками или переключателями;
  • CharacterPickerDialog — диалоговое окно, позволяющее выбрать символ с ударением, связанный с базовым символом;
  • ProgressDiaiog — диалоговое окно с индикатором прогресса при помощи компонента ProgressBar. В API 26 признан устаревшим.
  • DatePickerDialog — диалоговое окно выбора даты с элементом DatePicker
  • TimePickerDialog — диалоговое окно выбора времени с элементом TimePicker

Если ни один из существующих типов диалоговых окон вам не подходит, то можете создать своё собственное диалоговое окно.

Класс Dialog

Класс Dialog является базовым для всех классов диалоговых окон. Поскольку ProgressDialog, TimePickerDialog И DatePickerDialog — расширение класса AlertDialog, они также могут иметь командные кнопки.

Каждое диалоговое окно должно быть определено внутри активности или фрагмента, в которых будет использоваться. Диалоговое окно можно открыть один раз или несколько раз.

Для отображения диалогового окна необходимо вызвать метод showDialog() и передать ему в качестве параметра идентификатор диалога (константа, которую надо объявить в коде программы), который вы хотите отобразить.

Метод dismissDialog() прячет диалоговое окно (но не удаляет), не отображая его на экране. Окно остаётся в пуле диалоговых окон данной активности. При повторном отображении при помощи метода showDialog() будет использована кэшированная версия окна.

Метод removeDialog() удаляет диалоговое окно из пула окон данной активности. При повторном вызове метода showDialog() диалоговое окно придётся создавать снова.

Рассмотрим базовый пример создания диалогового окна на основе класса Dialog. Создайте простейшую разметку для диалогового окна — текстовое поле внутри LinearLayout. В разметку главной активности добавьте кнопку для вызова диалогового окна. В коде для главной активности напишем:

 Dialog dialog; @Override public void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); dialog = new Dialog(MainActivity.this); // Установите заголовок dialog.setTitle("Заголовок диалога"); // Передайте ссылку на разметку dialog.setContentView(R.layout.dialog_view); // Найдите элемент TextView внутри вашей разметки // и установите ему соответствующий текст TextView text = (TextView) dialog.findViewById(R.id.dialogTextView); text.setText("Текст в диалоговом окне. Вы любите котов?"); >public void onClick(View v) < // Выводим диалоговое окно на экран dialog.show(); >

Dialog

По умолчанию при показе диалогового окна главная активность затемняется. В документации есть константы, позволяющие управлять степенью затемнения:

 WindowManager.LayoutParams lp = dialog.getWindow().getAttributes(); lp.dimAmount = 0.6f; // уровень затемнения от 1.0 до 0.0 dialog.getWindow().setAttributes(lp); dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); // Установите заголовок dialog.setTitle("Заголовок диалога"); . 

На эмуляторе я не заметил разницы. В старой версии Android 2.3 был ещё эффект размытия WindowManager.LayoutParams.FLAG_BLUR_BEHIND, который теперь считается устаревшим. Если вы по упрямству всё равно пропишите данный эффект, то получите не эффект размытия, а чёрный фон. Кто знает, может вас устроит данный вариант.

Методы onCreateDialog() и onPrepareDialog()

Метод onCreateDialog() вызывается один раз при создании окна. После начального создания при каждом вызове метода showDialog() будет срабатывать обработчик onPrepareDialog(). Переопределив этот метод, вы можете изменять диалоговое окно при каждом его выводе на экран. Это позволит привнести контекст в любое из отображаемых значений. Если требуется перед каждым вызовом диалогового окна изменять его свойства (например, текстовое сообщение или количество кнопок), то можно реализовать внутри этого метода. В этот метод передают идентификатор диалога и сам объект Dialog, который был создан в методе onCreateDialog().

 @Override public void onPrepareDialog(int id, Dialog dialog) < switch(id) < case (TIME_DIALOG) : SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); Date currentTime = new Date(java.lang.System.currentTimeMillis()); String dateString = sdf.format(currentTime); AlertDialog timeDialog = (AlertDialog)dialog; timeDialog.setMessage(dateString); break; >> 

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

Можно создавать диалог без onCreateDialog(), например в обработчике нажатия кнопки вызова диалога, но тогда он не будет присоединён к текущей активности. Чтобы прикрепить его к активности, необходимо вызвать метод setOwnerActivity(), передав ему в качестве параметра текущую активность.

Перейдём к примеру. Если в активности должны вызываться несколько различных диалоговых окон, сначала необходимо определить целочисленный идентификатор для каждого диалога, например:

 static final int DIALOG_PAUSED_ID = 0; static final int DIALOG_GAMEOVER_ID = 1; 

Эти идентификаторы потом можно использовать в вызове метода showDialog() и в обработчике события onCreateDialog() в операторе switch:

 protected Dialog onCreateDialog(int id) < Dialog dialog; switch(id) < case DIALOG_PAUSED_ID: // Код для работы с диалогом Пауза break; case DIALOG_GAMEOVER_ID: // Код для работы с диалогом Игра окончена break; default: dialog = null; >return dialog; > 

Следует отметить, что методы Activity.onCreateDialog() и Activity.onPrepareDialog() устарели. Используйте DialogFragment.

Диалоговое окно AlertDialog

Примеры создания диалоговых окон типа AlertDialog рассмотрены в этой статье

AlertDialog с ссылкой

Практического смысла возможно не имеет, но можно сделать текст сообщения ссылкой.

 private void openSiteDialog() < final SpannableString webaddress = new SpannableString( "http://developer.alexanderklimov.ru/android/"); Linkify.addLinks(webaddress, Linkify.ALL); final AlertDialog aboutDialog = new AlertDialog.Builder( TestActivity.this).setMessage(webaddress) .setPositiveButton("OK", new DialogInterface.OnClickListener() < @Override public void onClick(DialogInterface dialog, int which) < // TODO Auto-generated method stub >>).create(); aboutDialog.show(); ((TextView) aboutDialog.findViewById(android.R.id.message)) .setMovementMethod(LinkMovementMethod.getInstance()); > 

Создание и отображение диалоговых окон

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

Создание диалогового окна

Dialog type Как создать его
Modeless Создайте CDialog , а затем вызовите Create функцию-член.
Модальный режим Создайте CDialog , а затем вызовите DoModal функцию-член.

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

Практическое руководство. Создание диалогового окна (C++)

Расположение и размер диалогового окна C++, а также расположение и размер элементов управления в нем измеряются в диалоговых единицах. Значения отдельных элементов управления и диалогового окна отображаются в правом нижнем углу строки состояния Visual Studio при их выборе.

Если проект еще не содержит RC-файл, см. статью «Создание файла скрипта ресурсов».

Инструкции

Редактор диалогов включает следующие возможности:

Создание диалогового окна

  1. В представлении ресурсов щелкните правой кнопкой мыши файл RC и выберите «Добавить ресурс«.
  2. В диалоговом окне «Добавить ресурс» выберите диалоговое окно в списке «Тип ресурса«, а затем нажмите кнопку «Создать«. Если знак плюса (+) отображается рядом с типом ресурса диалогового окна, это означает, что шаблоны диалоговых окон доступны. Выберите знак плюса, чтобы развернуть список шаблонов, выбрать шаблон и нажмите кнопку «Создать«. Откроется новое диалоговое окно в редакторе диалогов.

Вы также можете открыть существующие диалоговые окна в редакторе диалогового окна для редактирования.

Создание диалогового окна, которое пользователь не может выйти

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

  1. В области свойств диалогового окна задайте для свойства System Menu значение false . Этот параметр отключает системное меню диалогового окна и кнопку «Закрыть «.
  2. В форме диалогового окна удалите кнопки Отмена и ОК . Во время выполнения пользователь не может выйти из модального диалогового окна с этими характеристиками.

Чтобы включить тестирование этого типа диалогового окна, функция тестового диалогового окна обнаруживает, когда нажата клавиша ESC . Esc также называется виртуальным ключом VK_ESCAPE. Независимо от того, как диалоговое окно предназначено для поведения во время выполнения, можно завершить тестовый режим, нажав клавишу ESC.

Для приложений MFC, чтобы создать диалоговое окно, которое пользователи не могут выйти, необходимо переопределить поведение OnOK по умолчанию и OnCancel , даже если удалить связанные кнопки, диалоговое окно по-прежнему можно закрыть, нажав клавишу ВВОД или ESC.

Указание расположения и размера диалогового окна

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

  • Логическое свойство Center . Если задать значение True, диалоговое окно всегда будет отображаться в центре экрана. Если для этого свойства задано значение False, можно задать свойства XPos и YPos.
  • Свойства XPos и YPos, используемые для явного определения места отображения диалогового окна на экране. Эти свойства позиции — это значения смещения из верхнего левого угла области просмотра, которая определяется как .
  • Свойство Absolute Align , влияющее на позицию. Если значение True, координаты относительны к экрану. Если значение False, координаты относительны к окну владельца диалогового окна.

Проверка диалогового окна

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

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

Подключение в код диалогового окна, сделанный с помощью мастера, не включаются в имитацию.

При тестировании диалогового окна его положение обычно определяется относительно главного окна программы. Если для свойства Абсолютного выравниваниядиалогового окна задано значение True, диалоговое окно отображается в позиции, относительно левого верхнего угла экрана.

  1. Когда редактор диалогов является активным окном, перейдите в меню «Формат >теста».
  2. Чтобы завершить имитацию, нажмите клавишу ESC или нажмите кнопку «Закрыть » в диалоговом окне тестирования.

C++. Пример создания и вызова диалогового окна в MS Visual Studio 2010 — C++

Пример создания диалогового окна в MS Visual Studio 2010 — C++ (MFC)

Поиск на других ресурсах:

Условие задачи

1. Разработать диалоговое окно, которое содержит две кнопки OK и Cancel (рис. 1).

Visual C++. Шаблон MFC Application. Форма, которую нужно создать

Рис. 1. Форма, которую нужно создать

2. Осуществить вызов диалогового окна из основного окна приложения. Вывести соответствующее сообщение, если в диалоговом окне нажатая одна из двух клавиш: OK и Cancel .

Выполнение

1. Запустить MS Visual Studio 2010
2. Создать проект на C++ по шаблону Dialog Based Application

Подробный пример создания проекта по шаблону Dialog Based Application описывается здесь .

В окне создания нового проекта задать имя приложения как MFCApp . В будущем будем привязываться к этому имени.

Папка приложения в нашем случае (не важно):

E:\Programs\CPP\Train-04

Во время создания нового проекта в мастере выбираем Dialog Based Application . Все другие настройки оставляем по умолчанию.

В результате будут сгенерированы два класса с именами CMFCAppApp и CMFCAppDlg .

Окно MS Visual Studio после выполненных действий будет иметь вид как показано на рисунке 2.

C++. Шаблон MFC Application. Форма приложения после создания Dialog Based Application

Рис. 2. Форма приложения после создания Dialog Based Application

3. Изменение внешнего вида главной формы

Осуществим удаление кнопки OK . А кнопку Cancel переименуем в Exit .

Для удаления кнопки OK нужно сначала ее выделить, а потом нажать клавишу Delete .

Таким самым образом удаляем элемент в котором написано:

"TODO: Place dialog controls here."

Чтобы переименовать кнопку Cancel , сначала выделим ее, а потом в окне Properties в свойстве Caption набираем слово « Exit » (рис. 3). Таким образом, приложение уже настроено на нажатие на кнопку « Exit » таким образом, что происходит выход из приложения.

C++. Шаблон MFC Application. Переименование имени кнопки с

Рис. 3. Переименование имени кнопки с « Cancel » на « Exit «

Пока что, в окне панели Properties имеем два элемента:

  • IDD_MFCAPP_DIALOG – главное окно приложения;
  • IDCANCEL – кнопка « Exit » (бывшая « Cancel «).

Можно загрузить приложение на выполнение и протестовать его работу.

Выносим на форму другую кнопку, не привязанную к обработчикам событий. В окне панели Properties появляется еще один элемент IDC_BUTTON1 .

Форма приложения будет иметь вид, как показано на рисунке 4.

Visual C++. Шаблон MFC Application. Вынесение кнопки не привязанной к обработчику событий

Рис. 4. Вынесение кнопки не привязанной к обработчику событий

Свойство Caption кнопки IDC_BUTTON1 изменяем на Form2 . После нажатия на этой кнопке будет вызываться диалоговое окно.

4. Этапы построения диалогового окна

В Visual C++ любое диалоговое окно строится в три этапа:

  • формирование ресурсов диалогового окна;
  • создание класса диалогового окна;
  • использование класса диалогового окна.
5. Формирование класса и ресурсов диалогового окна

В MS Visual Studio ресурсы диалогового окна автоматически создаются после создания класса окна. Таким образом, создав класс окна, мы автоматически создаем ресурс окна.

Для работы с классами используется мастер классов Class Wizard . Чтобы вызвать Class Wizard делаем клик правой кнопкой мышки и в контекстном меню выбираем команду « Class Wizard… » (Рис. 5).

Visual C++. Шаблон MFC Application. Вызов

Рис. 5. Вызов « Class Wizard… » для создания класса и ресурса диалогового окна

В результате откроется окно, которое изображено на рисунке 6.

Visual C++. Шаблон MFC Application. Окно

Рис. 6. Окно « MFC Class Wizard «

Окно имеет такие поля:

1. Поле « Project: » – имеющиеся проекты в решении ( Solution ).

2. Поле « Class Name: » указывает имеющиеся классы в проекте. В нашем случае есть три класса с именами:

  • CMFCAppApp – класс приложения в целом;
  • CMFCAppDlg – класс диалогового окна приложения;
  • CAboutDlg – класс диалогового окна About , что было сформировано при создании проекта мастером AppWizard .

3. Поле « Base Class: » указывает на базовый класс, из которого унаследован класс, который отображается в поле « Class Name: «.

4. Поле « Resource: » определяет название ресурса, который отвечает классу из поля « Class Name: «.

5. Поле « Class declaration: » определяет название файла-заголовка для класса, который отображается в поле « Class Name: «.

6. Поле « Class implementation: » определяет название файла, в котором реализованы функции из класса, который отображается в поле « Class Name: «.

Также окно имеет пять вкладок, которые для класса из поля « Class Name :» описывают:

  • команды из карты сообщений;
  • сообщения Windows , которые генерируются в классе и могут обрабатываться;
  • виртуальные функции;
  • внутренние переменные, описанные в классе;
  • методы, имеющиеся в классе.

Чтобы добавить новый класс, вызовем команду « Add Class » (рис. 7).

Visual C++. Шаблон MFC Application. Команда добавления нового класса

Рис. 7. Команда добавления нового класса

В результате откроется окно « MFC Add Class Wizard «, в котором устанавливаем поля в значения, как изображено на рисунке 8. Для установления полей, достаточно в поле « Class Name: » набрать текст « CForm2 «. Автоматически будут заполнены все другие поля за исключением поля « Base class: «.

В поле «Base class:» указывается базовый класс CDialog .

Название ресурса устанавливается как IDD_FORM2 .

Заголовочный файл и файл реализации класса имеют названия « Form2.h » и « Form2.cpp «.

Visual C++. MFC Applicaiton. Создание нового класса CForm2 и ресурса IDD_FORM2, которые базируются на классе CDialog

Рис. 8. Создание нового класса CForm2 и ресурса IDD_FORM2 , которые базируются на классе CDialog

Делаем клик на « Finish «. В предшествующем окне видно, что к трем предшествующим классам добавлен класс CForm2 .

Снова делаем клик на « OK «.

6. Окно MS Visual Studio и панель Solution Explorer

После выполненных действий, окно панели Solution Explorer имеет вид, как показано на рисунке 9.

Visual C++. Шаблон MFC Application. Окно Solution Explorer

Рис. 9. Окно Solution Explorer

Как видно из рисунка 9, в списке заголовочных файлов появились файлы « Form2.h » и « Form2.cpp «. Соответственно, это являются файлы заголовка и реализации для новообразованного класса CForm2 .

7. Вызов диалогового окна класса CForm2 как ресурса

Чтобы начать формировать новое диалоговое окно (класс CForm2 ), нужно вызвать его как ресурс. Для этого в Solution Explorer делаем двойной клик мышкой на файле « MFCApp.rc » из вкладыша Resources (рис. 10).

Visual C++. Шаблон MFC Application. Вызов списка имен ресурсов приложения

Рис. 10. Вызов списка имен ресурсов приложения

Получаем список имен имеющихся ресурсов:

  • IDD_ABOUTBOX – ресурс диалогового окна About ;
  • IDD_FORM2 – ресурс новосозданного окна;
  • IDD_MFC_APP_DIALOG – ресурс главного окна приложения.

Для вызова нужного ресурса, необходимо на нем сделать двойной клик мышкой. Делаем двойной клик на ресурсе IDD_FORM2 . В результате, откроется новосозданное диалоговое окно (рис. 11). Как видно из рисунка 11, оно похоже на начальное окно приложения типа Dialog Based Application .

Visual C++. Шаблон MFC Applicaiton. Окно класса CForm2, который унаследован от класса CDialog

Рис. 11. Окно класса CForm2 , который унаследован от класса CDialog

Можно изменить размеры формы и размещение кнопок « OK » и « Cancel «.

8. Программирование события клика на кнопке « Form2 » главного окна приложения

Используя « Solution Explorer » и файл ресурсов « MFCApp.rc » (см. п. 7) переходим к ресурсу IDD_MFCAPP_DIALOG главного окна приложения (рис. 12).

Visual C++. Шаблон MFC Application. Главное окно приложения

Рис. 12. Главное окно приложения

В окне « Properties » выделяем кнопку с идентификатором IDC_BUTTON1 . Потом переходим на вкладыш « Control Events » (рис. 13).

Visual C++. Шаблон MFC Application. Список событий из вкладыша Control Events элемента управления IDC_BUTTON1

Рис. 13. Список событий из вкладыша Control Events элемента управления IDC_BUTTON1

В списке событий находим событие с названием BN_CLICKED . Потом выбираем кнопку выбора нисходящего меню и в меню выбираем « OnBnClickedButton1 » (рис. 14).

Visual C++. Шаблон MFC Application. Выбор события BN_CLICKED и вызов обработчика события OnBnClickedButton1

Рис. 14. Выбор события BN_CLICKED и вызов обработчика события OnBnClickedButton1

В результате откроется окно файла « MFCAppDlg.cpp » с выделенным фрагментом кода обработчика события OnBnClickedButton1 .

void CMFCAppDlg::OnBnClickedButton1() < // TODO: Add your control notification handler code here >

Между скобками нужно вставить свой собственный код обработки события.

Программный код функции обработки события клика на кнопке IDC_BUTTON1 следующий:

void CMFCAppDlg::OnBnClickedButton1() < // TODO: Add your control notification handler code here CForm2 dlg; // создание объекта типа "диалоговое окно" CString res_msg; // описание дополнительной переменной для вывода результата if (dlg.DoModal()==IDOK) // DoModal() - функция открытия окна < res_msg = "Return from Form2 is OK"; > else < res_msg = "Return from Form2 is Cancel"; > AfxMessageBox(res_msg); // вывод сообщения на экран >

Теперь можно запустить приложение на выполнение и протестировать его работу.

Связанные темы

  • Delphi. Создание новой формы и подключение ее к главной форме программы
  • Пример создания и вызова новой формы приложения в C#
  • C++ Builder. Пример создания и вызова новой формы из главной формы приложения

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *