Диалоговые окна в Android. Часть 1
Добрый день/вечер/утро, уважаемые хабравчане и Вы, %username%!
Я занимаюсь разработкой приложений для Android, обожаю эту операционную систему и хочу поделиться своим опытом использования в своих проектах диалоговых окон. В первую очередь эта статья записка очень пригодится начинающим в области разработки для Android.
Также для новичков в этой отрасли рекомендую сперва прочитать вот этот пост уважаемого Hoorsh.
А теперь приступим к рассмотрению данного вопроса (у которого есть несколько подводных камней) под катом.
Dialog
- AlertDialog: это диалоговое окно для различных сообщений приложения, например «Вы хотите купить мое приложение?» или что то в этом роде. AlertDialog поддерживает три кнопки — утвердительную (OK), отрицательную (Cancel) и нейтральную (Later).
- ProgressDialog: это диалоговое окно для отображения выполнения различных процессов, загрузки, например.
- DatePickerDialog: диалоговое окно предлагает пользователю выбрать дату.
- TimePickerDialog: диалоговое окно предлагает пользователю выбрать время
AlertDialog
- setTitle(int resID) — задает заголовок диалогового окна, принимает в качестве аргументов ссылку на ресурс или строку.
- setMessage(int resID) — задает сообщение в диалоговом окне, также принимает ссылку на ресурс или строку.
- setPositiveButton(int textID, DialogInterface.OnClickListener listener) — устанавливает на Вашем диалоговом окне утвердительную кнопку с текстом ресурса textID и слушателем listener. Методы setNegativeButton и setNeutralButton идентичны, с разницей в назначении кнопок.
AlertDialog.Builder builder = new AlertDialog.Builder(activity); builder.setTitle(R.string.dialog_about_title); builder.setMessage(R.string.dialog_about_message); builder.setCancelable(true); builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() < // Кнопка ОК @Override public void onClick(DialogInterface dialog, int which) < dialog.dismiss(); // Отпускает диалоговое окно >>); AlertDialog dialog = builder.create();
- showDialog(AlertDialog dialog) — самый простой способ показать диалоговое окно, но начиная с версии 3.0 разработчики Android не рекомендуют пользоваться этим методом, и в результате вы получите предупреждение, которое можно обойти только @SurpressWarning, что есть не совсем хорошо.
- AlertDialog dialog.show() — альтернативный способ показать окно, для этого в экземпляре dialog должен лежать результат метода Builder.create().
public class DialogScreen < public static final int IDD_ABOUT = 1; // Идентификаторы диалоговых окон public static final int IDD_SETTINGS = 2; public static final int IDD_RATE = 3; public static AlertDialog getDialog(Activity activity, int ID) < AlertDialog.Builder builder = new AlertDialog.Builder(activity); switch(ID) < case IDD_ABOUT: // Диалоговое окно About builder.setTitle(R.string.dialog_about_title); builder.setMessage(R.string.dialog_about_message); builder.setCancelable(true); builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() < // Кнопка ОК @Override public void onClick(DialogInterface dialog, int which) < dialog.dismiss(); // Отпускает диалоговое окно >>); return builder.create(); case IDD_RATE: // Диалоговое окно Rate the app builder.setTitle(R.string.dialog_rate_title); builder.setMessage(R.string.dialog_rate_message); builder.setCancelable(true); builder.setPositiveButton(R.string.dialog_rate_ok, new DialogInterface.OnClickListener() < // Переход на оценку приложения @Override public void onClick(DialogInterface dialog, int which) < // Переход dialog.dismiss(); >>); builder.setNeutralButton(R.string.dialog_rate_cancel, new DialogInterface.OnClickListener() < // Оценить приложение потом @Override public void onClick(DialogInterface dialog, int which) < dialog.dismiss(); // Отпускает диалоговое окно >>); builder.setNegativeButton(R.string.dialog_rate_buy, new DialogInterface.OnClickListener() < // Переход на покупку AdFree версии @Override public void onClick(DialogInterface dialog, int which) < // Переход dialog.dismiss(); >>); return builder.create(); case IDD_SETTINGS: // Диалог настроек View view = activity.getLayoutInflater().inflate(R.layout.settings, null); // Получаем layout по его ID builder.setView(view); builder.setTitle(R.string.dialog_settings_title); builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() < // Кнопка ОК public void onClick(DialogInterface dialog, int whichButton) < MainActivity.doSaveSettings(); // Переход в сохранение настроек MainActivity dialog.dismiss(); >>); builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() < // Кнопка Отмена public void onClick(DialogInterface dialog, int which) < dialog.dismiss(); >>); builder.setCancelable(true); return builder.create(); default: return null; > > >
Единственная заметка по поводу этого кода будет про использования метода setView(View view) в диалоге IDD_SETTINGS. У AlertDialog как и у всех остальных диалоговых окон есть одна приятная особенность — им можно задавать собственные Layout, что позволяет полностью видоизменять диалоговые окна и их содержимое. Здесь есть один подводный камень: обработку элементов этого Layout вы должны будете производить именно в той Activity, где вызываете это диалоговое окно. Например я показываю диалоговое окно IDD_SETTINGS в MainActivity с Layout по имени settings:
AlertDialog dialog = DialogScreen.getDialog(this, DialogScreen.IDD_SETTINGS); dialog.show(); initSettings(dialog); >
// Определяем SeekBar и привязываем к нему дельты настроек SeekBar sb_sense = (SeekBar)dialog.findViewById(R.id.seekSense); SeekBar sb_vol = (SeekBar)dialog.findViewById(R.id.seekVol); // Задаем этим SeekBar текущие значения настроек sb_sense.setProgress(sense); sb_vol.setProgress(volume);
Ну а дальше обрабатываете свои объекты как вам угодно.
Небольшой итог
1) Для большинства целей диалоговых окон подходит AlertDialog
2) AlertDialog может принимать вид layout с любыми объектами
3) Гораздо лучше использовать для диалоговых окон отдельный класс и пользоваться AlertDialog.show()
4) Обработка объектов кастомного layout производится в активности, вызвавшей диалог
В следующей части этой статьи пойдет речь о DialogFragment, который был включен в Android SDK начиная с 3.0 Honeycomb. Надеюсь эта статья поможет новичкам и не очень в своих квестах по завоеванию Google Play.
Java android всплывающее окно
Для создания простых уведомлений в Android используется класс Toast . Фактически Toast представляет всплывающее окно с некоторым текстом, которое отображается в течение некоторого времени.
Объект Toast нельзя создать в коде разметки xml, например, в файл activity_main.xml . Toast можно использовать только в коде java.
Так, определим в файле разметки activity_main.xml кнопку:
У кнопки установлен обработчик нажатия — метод onClick. Определим его в коде MainActivity:
package com.example.viewapp; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Toast; public class MainActivity extends AppCompatActivity < @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); >public void onClick(View view) < Toast toast = Toast.makeText(this, "Hello Android!",Toast.LENGTH_LONG); toast.show(); >>
В обработчике отображается всплывающее окно. Для его создания применяется метод Toast.makeText() , в который передается три параметра: текущий контекст (текущий объект activity), отображаемый текст и время отобажения окна.
В качестве времени показа окна мы можем использовать целочисленное значение — колическо миллисекунд или встроенные константы Toast.LENGTH_LONG (3500 миллисекунд) и Toast.LENGTH_SHORT (2000 миллисекунд).
Для самого отображения окна вызывается метод show() :
По умолчанию окно отображается внизу интерфейса с центрированием по центру. Но мы можем кастомизировать позиционирование окна с помощью методов setGravity() и setMargin() . Так, изменим метод onClick:
public void onClick(View view) < Toast toast = Toast.makeText(this, "Hello Android!", Toast.LENGTH_LONG); toast.setGravity(Gravity.TOP, 0,160); // import android.view.Gravity; toast.show(); >
Первый параметр метода setGravity указывает, в какой части контейнера надо позиционировать Toast, второй и третий параметр устанавливают отступы от этой позиции по горизонтали и вертикали сооветственно:
Метод setMargin() принимает два параметра: отступ от левой границы контейнера в процентах от шиирины контейнера и отступ от верхней границы в процентах от длины контейнера.
Пример AlertDialog (Диалоговое окно) в Android
Компонент AlertDialog (диалоговое окно) — один из важных элементов пользовательского интерфейса в любом приложении на Андроид. AlertDialog чаще всего используется в тех случаях, когда нам спросить пользователя о чем-то (разрешение/подтверждение выполнения какой-то операции). В этом уроке мы рассмотрим создание диалогового окна с помощью различных компоновок.
Теория по AlertDialog в Android
AlertDialog является базовым компонентом для построения Android приложений, поэтому мы должны хорошо понимать как он работает и уметь создавать различные компоновки диалоговых окон.
Для того, чтобы создать AlertDialog в Android, нам необходимо создать объект AlertDialogBuilder , который является вложенным классом AlertDialog . Рассмотрим пример:
Компоновка Android AlertDialog
Компоновка диалогового окна позволяет работать с несколькими составляющими:
Название — необязательный элемент диалогового окна
Контент — текст, который будет показан пользователю. Это может быть сообщение, список или же свой полностью кастомный макет.
Кнопки. Они бывают трех типов: для подтверждения (ОК), отмены и дополнительная (настраиваемая) кнопка. Любое диалоговое окно может содержать максимум три кнопки действий.
Методы для работы с диалоговыми окнами
- Метод setIcon(Drawable icon) устанавливает иконку (значок) в диалоговое окно
- Метод setCancelable(boolean cancelable) устанавливает возможность отмены действия в AlertDialog .
- Метод setMessage(CharSequence message) устанавливает сообщение, которое будет отображаться в диалоговом окне.
- setMultiChoiceItems(CharSequence[] items, boolean[] checkedItems, DialogInterface.OnMultiChoiceClickListener listener) задает список элементов, которые будут отображаться в диалоговом окне. Выбранный пользователем элемент списка будет отслеживаться слушателем
- После нажатия на кнопку «Отмена» диалогового окна, сработает метод setOnCancelListener (DialogInterface.OnCancelListener onCancelListener) .
- Метод setTitle(CharSequence title) устанавливает заголовок в AlertDialog .
- Метод getListView() получает тип списка, используемый в диалоговом окне.
Пример использования AlertDialog в Android
Давайте рассмотрим пример работы с AlertDialog . Начнем с макета, в котором расположим 3 кнопки. Каждая кнопка будет вызывать диалоговое окно с различной компоновкой: с 1 кнопкой — ОК, с двумя кнопками — Отмена и ОК, а также окно с тремя вариантами: ОК, Отмена и так называемая нейтральная кнопка.
Начнем с макета activity_main.xml нашего приложения: