Урок 60. Диалоги. AlertDialog: Title, Message, Icon, Buttons


В этом уроке:

- создаем AlertDialog
- настраиваем заголовок, сообщение, картинку и кнопки


Начнем знакомство с AlertDialog. Этот диалог используется, если вы хотите сообщить о чем-то пользователю или попросить его сделать выбор типа Да/Нет/Отмена.

Напишем приложение, которое при закрытии будет вызывать диалог о сохранении данных, аналогичный диалогу из программ MS Office . Если мы ответим Да, то данные сохранятся, если Нет – то не сохранятся, если Отмена – приложение не закроется.


Создадим проект:

Project name: P0601_AlertDialogSimple
Build Target: Android 2.3.3
Application name: AlertDialogSimple
Package name: ru.startandroid.develop.p0601alertdialogsimple
Create Activity: MainActivity


Добавим в res/values/strings.xml строки c текстами:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">AlertDialogSimple</string>
<string name="exit">Выход</string>
<string name="save_data">Сохранить данные?</string>
<string name="yes">Да</string>
<string name="no">Нет</string>
<string name="cancel">Отмена</string>
<string name="saved">Сохранено</string>
</resources>


Экран main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<Button
android:id="@+id/btnExit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/exit"
android:onClick="onclick">
</Button>
</LinearLayout>


Код MainActivity.java:

package ru.startandroid.develop.p0601alertdialogsimple;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends Activity {
 
 
final int DIALOG_EXIT = 1;
 
   
/** Called when the activity is first created. */
   
public void onCreate(Bundle savedInstanceState) {
       
super.onCreate(savedInstanceState);
        setContentView
(R.layout.main);
   
}
   
   
public void onclick(View v) {
     
// вызываем диалог
     
showDialog(DIALOG_EXIT);
   
}
   
   
protected Dialog onCreateDialog(int id) {
     
if (id == DIALOG_EXIT) {
       
AlertDialog.Builder adb = new AlertDialog.Builder(this);
       
// заголовок
       
adb.setTitle(R.string.exit);
       
// сообщение
       
adb.setMessage(R.string.save_data);
       
// иконка
       
adb.setIcon(android.R.drawable.ic_dialog_info);
       
// кнопка положительного ответа
       
adb.setPositiveButton(R.string.yes, myClickListener);
       
// кнопка отрицательного ответа
       
adb.setNegativeButton(R.string.no, myClickListener);
       
// кнопка нейтрального ответа
       
adb.setNeutralButton(R.string.cancel, myClickListener);
       
// создаем диалог
        return adb.create();
     
}
     
return super.onCreateDialog(id);
   
}
   
   
OnClickListener myClickListener = new OnClickListener() {
   
public void onClick(DialogInterface dialog, int which) {
     
switch (which) {
     
// положительная кнопка
     
case Dialog.BUTTON_POSITIVE:
        saveData
();
        finish
();
       
break;
     
// негаитвная кнопка
     
case Dialog.BUTTON_NEGATIVE:
        finish
();
       
break;
     
// нейтральная кнопка 
     
case Dialog.BUTTON_NEUTRAL:
       
break;
     
}
    }
  }
;
 
 
void saveData() {
   
Toast.makeText(this, R.string.saved, Toast.LENGTH_SHORT).show();
 
}
}

В обработчике кнопки onclick вызываем диалог.

В onCreateDialog мы создаем диалог. Для этого используется класс AlertDialog.Builder. Мы указываем заголовок, текст сообщения, иконку и кнопки. Диалог может содержать максимум три кнопки ответа: положительная, отрицательная и нейтральная. Для каждой указываем текст и обработчик. Метод create создает диалог и мы его возвращаем (return).

Обработчик кнопок myClickListener реализует интерфейс DialogInterface.OnClickListener и в нашем случае является общим для всех кнопок. В нем мы проверяем, какая кнопка была нажата:
если положительная (BUTTON_POSITIVE), то сохраняем данные и закрываем приложение
если отрицательная (BUTTON_NEGATIVE), то закрываем приложение без сохранения
если нейтральная (BUTTON_NEUTRAL), то не делаем ничего

В своем методе saveData выводим текст, что данные как-будто сохранены. Просто, чтобы убедиться, что метод выполняется.

Все сохраним и запустим приложение. Нажмем кнопку Выход:


если жмем Да,

то приложение закроется и метод saveData будет выполнен.



Если жмем Отмена, то диалог закроется и с приложением ничего не произойдет.
А если жмем Нет, то приложение закроется без вызова нашего метода saveData.

Вот так несложно и недолго создать диалог для взаимодействия с пользователем. Использованные нами атрибуты диалога не являются обязательными. Вы можете, например, не указывать заголовок, или сделать только одну кнопку, а не три.

Для указания заголовка, сообщения и текстов кнопок необязательно использовать переменные R.string.  Есть аналогичные реализации методов, которые принимают на вход просто текст.


И еще пара советов.

1) Чтобы диалог вызывался не только по кнопке выход, но и при нажатии на кнопку Назад в приложении, добавьте вызов диалога в реализацию метода onBackPressed

    public void onBackPressed() {
     
// вызываем диалог
     
showDialog(DIALOG_EXIT);
   
}


2) А если хотите, чтобы вызванный диалог не закрывался по нажатию кнопки Назад, то используйте метод setCancelable:

adb.setCancelable(false);



На следующем уроке:

- используем метод подготовки диалога