Компонент AlertDialog
(диалоговое окно) — один из важных элементов пользовательского интерфейса в любом приложении на Андроид. AlertDialog
чаще всего используется в тех случаях, когда нам спросить пользователя о чем-то (разрешение/подтверждение выполнения какой-то операции). В этом уроке мы рассмотрим создание диалогового окна с помощью различных компоновок.
Теория по AlertDialog в Android
AlertDialog является базовым компонентом для построения Android приложений, поэтому мы должны хорошо понимать как он работает и уметь создавать различные компоновки диалоговых окон.
Для того, чтобы создать AlertDialog
в Android, нам необходимо создать объект AlertDialogBuilder
, который является вложенным классом AlertDialog
. Рассмотрим пример:
1 |
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this); |
Компоновка 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
нашего приложения:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <Button android:id="@+id/btn_alertBtn1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/alertdialog_1" /> <Button android:id="@+id/btn_alertBtn2" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/btn_alertBtn1" android:text="@string/alertdialog_2" /> <Button android:id="@+id/btn_alertBtn3" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/btn_alertBtn2" android:text="@string/alertdialog_3" /> </RelativeLayout> |
Как видно из макета, у нас 3 вложенных виджета Button в корневой RelativeLayout
. Атрибуты android:text
как и полагается, вынесены в strings.xml
в папке res/values/:
1 2 3 4 5 6 |
<resources> <string name="app_name">HelloAlertDialog</string> <string name="alertdialog_1">AlertDialog с 1 кнопкой</string> <string name="alertdialog_2">AlertDialog с 2 кнопками</string> <string name="alertdialog_3">AlertDialog с 3 кнопками</string> </resources> |
Теперь инициализируем наши виджеты в коде. Также нам нужно проставить слушатели на кнопки и по нажатию вызывать нужный AlertDialog
. Сделаем мы это через реализацию интерфейса View.OnClickListener
, а вызов нужного диалогового окна будет происходить в операторе switch. Листинг класса MainActivity приведен ниже:
1 2 3 4 5 6 7 8 9 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 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 |
package ua.com.prologistic; import android.app.AlertDialog; import android.content.DialogInterface; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.Toast; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Button btnOne; private Button btnTwo; private Button btnThree; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // инициализируем кнопки по идентификаторах в макете btnOne = (Button) findViewById(R.id.btn_alertBtn1); btnTwo = (Button) findViewById(R.id.btn_alertBtn2); btnThree = (Button) findViewById(R.id.btn_alertBtn3); // устанавливаем слушатели btnOne.setOnClickListener(this); btnTwo.setOnClickListener(this); btnThree.setOnClickListener(this); } // показываем AlertDialog в зависимости от нажатой клавиши @Override public void onClick(View v) { int id = v.getId(); // находит по id нажатый виджет Button и вызывает нужный метод switch (id) { case R.id.btn_alertBtn1: createOneButtonAlertDialog("Диалоговое окно с 1й кнопкой", "Это просто сообщение"); break; case R.id.btn_alertBtn2: createTwoButtonsAlertDialog("Диалоговое окно с 2я кнопками", "Это просто сообщение"); break; case R.id.btn_alertBtn3: createThreeButtonsAlertDialog("Диалоговое окно с 3я кнопками", "Это просто сообщение"); break; } } // создает диалоговое окно с 1й кнопкой private void createOneButtonAlertDialog(String title, String content) { // объект Builder для создания диалогового окна AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); // добавляем различные компоненты в диалоговое окно builder.setTitle(title); builder.setMessage(content); // устанавливаем кнопку, которая отвечает за позитивный ответ builder.setPositiveButton("OK", // устанавливаем слушатель new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { // по нажатию создаем всплывающее окно с типом нажатой конпки showMessage("Нажали ОК"); } }); // объект Builder создал диалоговое окно и оно готово появиться на экране // вызываем этот метод, чтобы показать AlertDialog на экране пользователя builder.show(); } // создает диалоговое окно с тремя кнопкаи private void createThreeButtonsAlertDialog(String title, String content) { AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); builder.setTitle(title); builder.setMessage(content); builder.setNegativeButton("NO", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { showMessage("Нажали Нет"); } }); builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { showMessage("Нажали ОК"); } }); // устанавливаем кнопку, которая отвечает за выбранный нами ответ // в данном случаем мы просто хотим всплывающее окно с отменой builder.setNeutralButton("Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { showMessage("Нажали Отмена"); } }); builder.show(); } // создает диалоговое окно с двумя кнопкаи private void createTwoButtonsAlertDialog(String title, String content) { AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); builder.setTitle(title); builder.setMessage(content); builder.setNegativeButton("NO", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { showMessage("Нажали Нет"); } }); builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { showMessage("Нажали ОК"); } }); builder.show(); } // вспомогательный метод для вывода всплывающих сообщений private void showMessage(String textInMessage) { Toast.makeText(getApplicationContext(), textInMessage, Toast.LENGTH_LONG).show(); } } |
В результате мы получим сборный результат нажатий на каждую кнопку. После нажатия на каждую кнопку появляется всплывающее окно:
Следите за обновлениями и подписывайтесь на рассылку новых статей.