Диалоговое окно AlertDialog
AlertDialog
AlertDialog с кнопками
AlertDialog со списком
AlertDialog с переключателями
AlertDialog с флажками
Автоматическое закрытие окна
AlertDialog
Рассмотрим работу с диалоговым окном AlertDialog.
Диалог AlertDialog является расширением класса Dialog и это наиболее используемое диалоговое окно в практике программиста. Очень часто требуется показать диалог с кнопками Да и Нет. В создаваемых диалоговых окнах можно задавать следующие элементы:
- заголовок
- текстовое сообщение
- кнопки: от одной до трех
- списо;
- флажки
- переключатели
В первом примере мы покажем вызова диалогового окна без участия метода onCreateDialog().
Прежде чем вызывать диалоговое окно, нужно хорошенько подготовиться. Начнем со строковых ресурсов. Снова открываем файл strings.xml и добавляем новые строки:
<string name="choose_title">Выбор</string>
<string name="red_pill_label">Красная таблетка</string>
<string name="blue_pill_label">Синяя таблетка</string>
В первой строчки мы задали заголовок для окна, а в двух других - тексты сообщений.
Теперь необходимо создать список выбора при помощи ресурса массива. Для этого создается новый файл arrays.xml в папке res/values:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<array name="choose">
<item>@string/red_pill_label</item>
<item>@string/blue_pill_label</item>
</array>
</resources>
Вы видите, что массив определенным образом связан с строковыми ресурсами.
Вызов диалогового окна
Приготовления закончены. Переходим к файлу HelloWorld.java и импортируем два пространства имен.
import android.app.AlertDialog;
import android.content.DialogInterface;
На прошлых занятиях мы наплодили целых шесть кнопок, которые просто изнывают от безделья (кроме шестой, которая выводит новое окно, см. Activity). Давайте теперь включим в работу пятую кнопку. Чтобы не запутаться, изменим у кнопки текст на Показать диалоговое окно: <string name="button5">Показать диалоговое окно</string>, а также добавляем к свойству кнопки On click обработчик события butShowDialog_Click (вспоминаем Щелчок мыши).
public void butShowDialog_Click(View v){
switch (v.getId()){
case R.id.button5:
ShowAlertDialog();
break;
}
}
public void ShowAlertDialog(){
new AlertDialog.Builder(this)
.setTitle(R.string.choose_title)
.setItems(R.array.choose,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialoginterface,
int i) {
showText(i);
}
})
.show();
}
private void showText(int i){
if(i == 0){
edtext.setText("Вы сделали правильный выбор");
}else{
edtext.setText("Возможно вы правы");
}
}
В обработчике щелчка мыши используется функция ShowAlertDialog, которая и выводит диалоговое окно на экран. Перед выводом на экран диалоговое окно необходимо построить, т.е. указать, какие элементы должны присутствовать в окне. В нашем примере мы установили заголовок (setTitle), а также два элемента из массива (setItems) с собственными обработчиками события onClick.
На самом деле диалоговое окно AlertDialogq очень гибкое в настройках и я показал вам только один пример. Диалоговое окно по вашему желанию может быть очень простым, например, с двумя стандартными кнопками «Да» и «Нет», а также очень сложным (с значками, списками, переключателями).
AlertDialog с кнопками
Теперь перейдем к классическому использованию диалоговых окон при помощи onCreateDialog(). Начнем с диалогового окна с кнопками.
Для создания окна AlertDialog с кнопками используется группа методов класса AlertDialog.Builder:
- setPositiveButton();
- setNegativeButton();
- setNeutralButton()
Сначала необходимо создать объект класса Builder, передав в качестве параметра контекст приложения. Затем, используя методы класса Builder, задать для создаваемого диалога текстовое сообщение (метод setMessage()), а также кнопки диалога и обработку событий на них. В AlertDialog можно добавить только по одной кнопке каждого типа: Positive, Neutral и Negative, т. е. максимально возможное количество кнопок в диалоге — три. На названия кнопок не обращайте внимания, они не несут смысловой нагрузки. Но они помогут вам определить порядок вывода кнопок: первой выводится Positive, второй - Neutral, третьей - Negative. Для каждой кнопки используется один из методов с префиксом set, которые принимают в качестве параметров надпись для кнопки и интерфейс DialogInterface.onclickListener, который определяет действие, когда пользователь нажимает кнопку. Чтобы пользователь не мог закрыть диалог клавишей Back на клавиатуре телефона, вызывается метод setCancelable()с параметром false. И, наконец, для отображения окна вызывается builder.create(). Например, для создания диалога с кнопками Мяу, Гав, Сам дурак! код будет выглядеть приблизительно так (добавьте на форму кнопку для вызова окна):
public class AlertDialogDemoActivity extends Activity {
// идентификатор диалогового окна AlertDialog с кнопками
private final int IDD_THREE_BUTTONS = 0;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final Button alertThreeButtons = (Button)findViewById(R.id.buttonAlertButton);
// пишем обработчик события для кнопки вызова диалога
alertThreeButtons.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// вызываем диалог
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) {
AlertDialogDemoActivity.this.finish();
}
})
.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();
}
});
AlertDialog alert = builder.create();
return builder.create();
default:
return null;
}
}
}
AlertDialog со списком
Если вам нужно диалоговое окно со списком выбираемых пунктов вместо кнопок, то используйте метод setItems(), где нужно указать массив данных для отображения в списке диалога и интерфейс Diaioginterface.OnciickListener, который определяет действие, когда пользователь выбирает элемент списка.
final Button alertListCats = (Button)findViewById(R.id.buttonAlertList);
// обработчик для кнопки вызова диалога со списком
alertListCats.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
showDialog(IDD_LIST_CATS);
}
});
case IDD_LIST_CATS:
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();
Запустите проект на выполнение. При нажатии кнопки вызова диалога должно появиться окно AlertDiaiog со списком из трех пунктов для выбора имени кота. При выборе одного из пунктов меню появится всплывающее уведомление, показывающее выбранного кота.
AlertDialog с переключателями
Для создания диалогового окна с переключателями RadioButton применяется метод setSingieChoiceitems(). Если диалоговое окно создается внутри onCreateDiaiog(), система Android управляет состоянием списка с переключателями. Пока текущая деятельность активна, диалоговое окно при последующих вызовах запоминает ранее выбранные пункты.
Создание AlertDiaiog с переключателями очень похоже на создание диалогового окна со списком, только вместо метода setItems() вызывается метод setSingleChoiceItems():
case IDD_RADIO:
builder = new AlertDialog.Builder(this);
builder.setTitle("Выберите любимое имя кота")
.setCancelable(false)
// добавляем одну кнопку для закрытия диалога
.setNeutralButton("Назад", new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int id)
{
dialog.cancel();
}
})
// добавляем переключатели
.setSingleChoiceItems(mCatsName, -1,
new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int item)
{
Toast.makeText(getApplicationContext(),
"Любимое имя кота: " +
mCatsName[item],
Toast.LENGTH_SHORT).show();
}
});
return builder.create();
Обратите внимание на следующие детали. При выборе переключателя диалоговое окно закрываться не будет. Поэтому необходимо предусмотреть механизм закрытия окна, например, добавить кнопку. Второй момент - в методе setSingieChoiceitems для первого параметра используется массив значений для переключателей, а для второго параметра используется целочисленное значение индекса переключателя, который будет включен по умолчанию при вызове диалогового окна. Если вы хотите, чтобы все переключатели при запуске были в выключенном состоянии, то используйте значение -1.
AlertDialog с флажками
Если вы хотите использовать вместо переключателей флажки (CheckBox) для множественного выбора, то вам нужен метод setMultiChoiceItems(). Код практически идентичен предыдущему примеру:
case IDD_CHECK_CATS:
builder = new AlertDialog.Builder(this);
builder.setTitle("Выберите котов")
.setCancelable(false)
.setMultiChoiceItems(mCatsName, 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 < mCatsName.length; i++)
{
state.append("" + mCatsName[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, которое закрывается через одну-две секунды, диалоговые окна сами не закрываются, а ждут реакции пользователя. Но если мы воспользуемся таймером, то сможем обойти это ограничение (подсмотрел тут).
Добавим в проект кнопку для вызова самозакрывающего диалогового окна и напишем код для обработчика щелчка кнопки:
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.
}

