Диалоговое окно – это небольшое окно, которое предлагает пользователю принять решение или ввести дополнительную информацию. Диалоги, как правило, не занимают весь экран и используются в событиях, для продолжения которых требуется действие пользователя.
Базовый класс для диалогов – Dialog, но его напрямую реализовывать не рекомендуется. Рекомендуется использовать:
AlertDialog – диалоговое окно, в котором могут отображаться заголовок, до трех кнопок, список для выбора либо пользовательский макет;
DatePickerDialog или TimePickerDialog – диалоги для выбора даты и времени.
В качестве контейнера диалоговых окон следует использовать DialogFragment.
Очень подробная статья про использование и конфигурацию диалогов - здесь.
Дополнительную информацию и диалогах и сценариях их использования читайте здесь, здесь и здесь.
Создание и открытие диалогового окна
Для создания диалога необходимо расширить класс DialogFragment и создать AlertDialog в callback-методе onCreateDialog().
Рассмотрим работу с диалоговыми окнами на примере. Создадим проект, добавим в макет поле ввода и кнопку, по нажатию на которую появляется диалоговое окно
Обратите внимание, что, так как диалоговое окно является фрагментов, для его корректной работы мы должны передать объект FragmentManager, который осуществляет управление фрагментами.
Запустим приложение и посмотрим на результат
Настройка диалогового окна
Android позволяет гибко настроить внешний вид и поведение диалогового окна: вы можете добавить, заголовок, иконку, до трех кнопок, а также менять тип сообщения или даже предоставить свой макет для создания уникальных диалоговых окон.
Давайте попробуем модифицировать наше диалоговое окно. Для этого нам необходимо вернуться в класс диалога и в методе onCreateDialog() и добавить нужные компоненты с помощью сеттеров объекта строителя.
Отдельно стоит упомянуть про стандартные диалоговое окна для выбора даты (класс DatePickerDialog) и времени (класс TimePickerDialog).
Выбор даты и времени также реализован в виде отдельных UI виджетов, которые можно поместить в любой макет.
Для создания диалогового окна для выбора одновременно даты и времени, используйте сторонние библиотеки либо можете реализовать это самостоятельно с помощью собственного макета диалогового окна.
Рассмотрим пример создания диалогового окна для выбора даты. Обратите внимание, что номер возвращаемого месяца начинается с 0, поэтому увеличиваем значение месяца на единицу.
MyDialog.java
publicclassMyDialogextendsDialogFragment { @NonNull @OverridepublicDialogonCreateDialog(@NullableBundle savedInstanceState) {finalCalendar c =Calendar.getInstance();int year =c.get(Calendar.YEAR);int month =c.get(Calendar.MONTH);int day =c.get(Calendar.DAY_OF_MONTH);// Передаем контекст, слушатель для выбора даты и текущую датуreturnnewDatePickerDialog(getActivity(), listener, year, month, day); }// Слушатель для выбора даты, выводим на экран сообщениеprivateDatePickerDialog.OnDateSetListener listener = (view, year, month, dayOfMonth) -> {String msg ="дата: "+ dayOfMonth +"/"+ (month +1) +"/"+ year;Toast.makeText(getActivity(), msg,Toast.LENGTH_SHORT).show(); };}
Рассмотрим пример для диалогового окна выбора времени.
MyDialog.java
publicclassMyDialogextendsDialogFragment { @NonNull @OverridepublicDialogonCreateDialog(@NullableBundle savedInstanceState) {finalCalendar c =Calendar.getInstance();int hour =c.get(Calendar.HOUR_OF_DAY);int minute =c.get(Calendar.MINUTE);// Передаем контекст, слушатель, текущее время и запрашиваем у системы// в каком формате отображается на устройстве время (12 или 24 часа)returnnewTimePickerDialog(getActivity(), listener, hour, minute,DateFormat.is24HourFormat(getActivity())); }// Слушатель для выбора времениprivateTimePickerDialog.OnTimeSetListener listener = (view, hourOfDay, minute) -> {String msg ="Выбранное время "+ hourOfDay +":"+ minute;Toast.makeText(getActivity(), msg,Toast.LENGTH_SHORT).show(); };}