Android Studio: диалоговое окно AlertDialog
Пользователям часто нужны напоминания, которые будут указывать на выбор или ошибки. Для этого в Android есть специальная встроенная программа, которая гибко настраивается под любые задачи – android studio всплывающее окно. При помощи сервиса удается экономить память и другие ресурсы, создавая заголовки, информационный массив, клавиши и прочее.
Что такое Android Studio? Это специальная среда IDE, которая позволит работать, настраивать и управлять операционной системой Android.

С одной клавишей
Для начала следует разобраться с легким примером, в котором используется только 1 клавиша. Первым делом формируется объем AlertDialog.Builder, передающий в виде примера контекст. После в работу входит техника Builder и формируется для всплывающего меню заголовок, используя команду setTitle(). Для текста подходит способ setMessage(), установка значка формируется в виде setIcon(). Чтобы установить клавишу, применяется техника setNegativeButton(), а обеспечить возможность нажатия на сделанную кнопку поможет комбинация cancel(). Обращать внимание на название техник не нужно, они не несут большой нагрузки.

Для исключения закрытия диалогового окна при помощи кнопки возврата на смартфоне, применяется метод setCancelable() со значением false. В самом конце требуется добиться всплывания окна при помощи команды show(). Например:
public void onClick(View v) { AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); builder.setTitle("Важное сообщение!") .setMessage("Закройте окно!") .setIcon(R.drawable.ic_android_cat) .setCancelable(false) .setNegativeButton("ОК, иду на балкон", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }); AlertDialog alert = builder.create(); alert.show(); }
Особенности создания и пример с 2 клавишами
На основе кода видно пример формирования диалогового окна с наличием 2 клавиш для использования:
package ru.alexanderklimov.alertdialogdemo; import android.os.Bundle; import android.app.Activity; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnCancelListener; import android.content.DialogInterface.OnClickListener; import android.view.Menu; import android.view.View; import android.widget.Toast; public class MainActivity extends Activity { AlertDialog.Builder ad; Context context; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); context = MainActivity.this; String title = "Выбор есть всегда"; String message = "Выберите одежду"; String button1String = "Удобная одежда"; String button2String = "Красивая одежда"; ad = new AlertDialog.Builder(context); ad.setTitle(title); // заголовок ad.setMessage(message); // сообщение ad.setPositiveButton(button1String, new OnClickListener() { public void onClick(DialogInterface dialog, int arg1) { Toast.makeText(context, "Вы сделали правильный выбор", Toast.LENGTH_LONG).show(); } }); ad.setNegativeButton(button2String, new OnClickListener() { public void onClick(DialogInterface dialog, int arg1) { Toast.makeText(context, "Возможно вы правы", Toast.LENGTH_LONG) .show(); } }); ad.setCancelable(true); ad.setOnCancelListener(new OnCancelListener() { public void onCancel(DialogInterface dialog) { Toast.makeText(context, "Вы ничего не выбрали", Toast.LENGTH_LONG).show(); } }); } public void onClick(View v) { ad.show(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } }
Общие параметры кода не меняются, прежними будут настройки, клавиши и обработка информации. Доступно добавлять в AlertDialog только по 1 клавише любого вида, поэтому в окне будет максимум 3 кнопки для использования.

Для каждого показателя применяются методы со вставкой set...Button, принимающие за основу подпись и внешний вид DialogInterface.OnClickListener, характеризующий операцию при касании. Чтобы исключить закрытие с помощью клавиатуры смартфона, в коде прописывается setCancelable() со значением false или true. Чтобы результат работы отобразился на экране, применяется способ show().
AlertDialog – гибкая программа для настроек. Всплывающее окно бывает самым простым с классическим выбором "Да" и "Нет", но при помощи перечня, флажков или переключателей, конструкция будет усложняться.
Метод onCreateDialog в AlertDialog
Чтобы при помощи android studio alertdialog сохранило состояние, потребуется применять способ активности onCreateDialog(). Для начала выполняются описанные этапы, а для показа работы указывается builder.create(). Пример кода:
package ru.alexanderklimov.alertdialogdemo; import android.os.Bundle; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnCancelListener; import android.content.DialogInterface.OnClickListener; import android.view.Menu; import android.view.View; import android.widget.Toast; public class MainActivity extends Activity { AlertDialog.Builder ad; Context context; // идентификатор диалогового окна AlertDialog с кнопками private final int IDD_THREE_BUTTONS = 0; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ... } public void onClick(View v) { //ad.show(); showDialog(IDD_THREE_BUTTONS); } @Override protected Dialog onCreateDialog(int id) { switch (id) { case IDD_THREE_BUTTONS: AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage("Выберите правильный ответ") .setCancelable(false) .setPositiveButton("Да", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }) .setNeutralButton("Не знаю", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }) .setNegativeButton("Нет", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }); return builder.create(); default: return null; } } }
Поскольку в одном приложении применяется сразу несколько типов диалоговых окон, потребуется сделать отдельный идентификатор, который поможет вызывать конкретный диалог. Работая на новой ОС Android видно, что метод показа всплывающего окна перечеркнут, поскольку он устаревший. С версии 3.0 пользуются техникой DialogFragment. Для проекта идентификатором выступает IDD_THREE_BUTTONS.

AlertDialog с перечнем
Некоторым пользователям важно использовать окна, в которых будет список с несколькими строками на выбор. Они заменяют клавиши, и для этого в коде применяют способ setItems(). В нем указывается часть информации для вывода на экран и dialogInterface.OnClickListener, позволяющий выбрать действие, во время выбора конкретной части из перечня. Для этого готовый код дополняется еще одной клавишей:
private final int IDD_LIST_CATS = 1; public void onClick(View v) { switch (v.getId()) { ... case R.id.button2: showDialog(IDD_LIST_CATS); break; ... } @Override protected Dialog onCreateDialog(int id) { switch (id) { ... case IDD_LIST_CATS: final String[] mCatsName ={"Тимка", "Пушок", "Кузя"}; builder = new AlertDialog.Builder(this); builder.setTitle("Выбираем кота"); // заголовок для диалога builder.setItems(mCatsName, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int item) { // TODO Auto-generated method stub Toast.makeText(getApplicationContext(), "Выбранный кот: " + mCatsName[item], Toast.LENGTH_SHORT).show(); } }); builder.setCancelable(false); return builder.create(); default: return null; } }
После выполнения проекта android studio alertdialog со списком, проводится запуск для проверки. Во время контакта с клавишей должно быть окно AlertDialog, в котором содержится перечень из 3 наименований, помогающий выбрать имя питомца. После касания одного выплывает сообщение, демонстрирующее выбранного питомца.

AlertDialog с переключателями
Всплывающее меню можно сделать с переключателями RadioButton. Для этого применяется техника setSingleChoiceitems() взамен способу setItems(). Если при помощи android studio диалоговое окно делается внутри onCreateDialog(), тогда операционная система Андроид будет управлять состоянием перечня при помощи переключателей. На момент активной работы, меню при дальнейших вызовах сохранит в памяти, ранее выбранные строки.
private final int IDD_RADIO_CATS = 2; // часть кода из onCreateDialog() case IDD_RADIO_CATS: final String[] mChooseCats = { "Тимка", "Пушок", "Кузя" }; builder = new AlertDialog.Builder(this); builder.setTitle("Выберите любимое имя кота") .setCancelable(false) // добавляем одну кнопку для закрытия диалога .setNeutralButton("Назад", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }) // добавляем переключатели .setSingleChoiceItems(mChooseCats, -1, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int item) { Toast.makeText( getApplicationContext(), "Любимое имя кота: " + mChooseCats[item], Toast.LENGTH_SHORT).show(); } }); return builder.create();
Создавая проект нужно обратить внимание на детали. Когда выбирается переключатель, всплывающее окно не будет закрываться, нужно заранее продумать этот момент и технику закрытия. К примеру, возможно добавить клавишу. Вторым фактором при использовании способа setSingleChoiceitems выступает то, что для первого значения применяется полный код и настройки, а для второго нужно применить целочисленный показатель индекса, оставляя его включенным всегда при всплывании окна. Значение "-1" применяется для отключения переключателей во время старта окна.

AlertDialog с флажками
Описанные переключатели возможно заменить флажками, которые называются CheckBox. Чтобы получить доступ к выбору параметров, необходимо применить код setMultiChoiceItems(). Визуально изменений почти нет, а детали можно просмотреть в самом коде:
private final int IDD_CHECK_CATS = 3; // часть кода из onCreateDialog() case IDD_CHECK_CATS: final boolean[] mCheckedItems = { false, true, false }; final String[] checkCatsName = { "Тимка", "Пушок", "Кузя" }; builder = new AlertDialog.Builder(this); builder.setTitle("Выберите котов") .setCancelable(false) .setMultiChoiceItems(checkCatsName, mCheckedItems, new DialogInterface.OnMultiChoiceClickListener() { @Override public void onClick(DialogInterface dialog, int which, boolean isChecked) { mCheckedItems[which] = isChecked; } }) // Добавляем кнопки .setPositiveButton("Готово", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { StringBuilder state = new StringBuilder(); for (int i = 0; i < checkCatsName.length; i++) { state.append("" + checkCatsName[i]); if (mCheckedItems[i]) state.append(" выбран\n"); else state.append(" не выбран\n"); } Toast.makeText(getApplicationContext(), state.toString(), Toast.LENGTH_LONG) .show(); } }) .setNegativeButton("Отмена", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }); return builder.create();
Первое значение в способе setMultiChoiceItems() выступает массивом настроек для перечня с флажками.

Второе считается булевым массивом состояний, заданных по стандартным настройкам при вызове окна. К примеру, чтобы отметить флажком вторую строку, а другие оставить без изменений, используется код:
final boolean[] mCheckedItems = {false, true, false};
По аналогии с переключателями для всплывающего меню с флажками потребуется применять клавиши для закрытия меню. В запущенном приложении сохраняется предыдущий параметр состояния.
Автоматическое закрытие окна
Обычные сообщения класса Toast закрываются через 1-2 секунды, но диалоговые окна не будут самостоятельно закрываться, пока пользователь не сделает манипуляцию.

При использовании таймера можно убрать ограничение, добавляя клавишу автоматического закрытия. Для этого используется специальный код.
public void onClick(View v) { AlertDialog.Builder builder = new AlertDialog.Builder(v.getContext()); builder.setTitle("Автоматическое закрытие окна"); builder.setMessage("Через пять секунд это окно закроется автоматически!"); builder.setCancelable(true); final AlertDialog dlg = builder.create(); dlg.show(); final Timer timer = new Timer(); timer.schedule(new TimerTask() { public void run() { dlg.dismiss(); // when the task active then close the dialog timer.cancel(); // also just top the timer thread, otherwise, // you may receive a crash report } }, 5000); // через 5 секунд (5000 миллисекунд), the task will be active. }
AlertDialog с рейтингом (проблемный пример)
Применение метода RatingBar для диалогового окна приводит к некорректной работе кода. На дисплее смартфона всегда всплывает 6 звездочек, невзирая на заданные параметры. Если перевернуть приложение в альбомную ориентацию, то будет показано от 7 звездочек, исходя из диагонали.

public TextView txtView; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_test); txtView = (TextView) findViewById(R.id.textView1); } public void onClick(View v) { showRatingDialog(); } public void showRatingDialog() { final AlertDialog.Builder ratingdialog = new AlertDialog.Builder(this); final RatingBar rating = new RatingBar(this); ratingdialog.setIcon(android.R.drawable.btn_star_big_on); ratingdialog.setTitle("Голосуем за любимое имя!"); ratingdialog.setView(rating); rating.setMax(5); rating.setNumStars(5); rating.setStepSize((float) 1.0); ratingdialog.setPositiveButton("Готово", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { txtView.setText(String.valueOf(rating.getRating())); dialog.dismiss(); } }) .setNegativeButton("Отмена", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }); ratingdialog.create(); ratingdialog.show(); }
Для решения проблемы нужно элемент RatingBar поместить в макете wrap_content. Рекомендуется сделать отдельную разметку, с подключением ее к всплывающему окну. Для открытия доступа к настройкам элемента используется метод View.findViewById().
Следует избегать ProgressDialog
Android studio dialog – стандартный класс для всех всплывающих окон. ProgressDialog – это расширение, но оно тоже имеет специальные клавиши, а также индикатор выполненных задач. Но если потребуется показать процесс загрузки или любой другой информации, тогда используется отдельная инструкция по дизайну, что позволяет применять расширение в созданном макете.

Все классы позволяют установить стиль, структуру диалогового окна, но для этого применяется DialogFragment, как отдельный элемент. Эта группа дает возможность работы со всеми функциями, которые требуются для формирования всплывающих окон, их дизайном, вместо вызова способов к объекту Dialog.
Применение в работе для управления DialogFragment позволяет добиться корректной обработки жизненных событий в определенное время, поскольку можно задать дополнительные клавиши «Назад» или повернуть экран. Еще класс позволяет повторно использовать интерфейс в виде встраиваемого элемента высшего уровня, по аналогии с классом Fragment. Это требуется при необходимости разного отображения окон на экранах больших и малых устройств.
В результате того, что описанный класс первоначально есть в Android 3.0, в нем будет описано применение класса DialogFragment, которое есть в Библиотеке поддержки. После ее добавления можно воспользоваться самим классом и другими API на гаджетах под управлением ОС Android 1.6 и выше. Если применяются вспомогательные библиотеки, рекомендуется провести импорт класса android.support.v4.app.DialogFragment, но не использовать android.app.DialogFragment.
На видео детально представлены диалоговые окна и программирование Андроид: