{DATE}
© Денис Колисниченко
В этой статье мы рассмотрим диалоги следующих типов:
Самый частый вариант применения диалога AlertDialog — это классический диалог вопроса с кнопками Да и Нет. Вот сейчас и займемся его разработкой. При запуске наше приложение отобразит диалог, при нажатии кнопки Нет не будет произведено никаких действий — будет вызван метод cancel(). А вот действие при нажатии кнопки Да запрограммируете вы сами — но позже, когда научитесь устанавливать интернет-соединения. Взгляните, как будет выглядеть наш диалог на рис. 1.
Код приложения, отображающего этот диалог, представлен в листинге 1.
Рис. 1. Диалог типа AlertDialog
Листинг 1. Отображение диалога типа AlertDialog
package com.sample.dialog;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.content.DialogInterface;
import android.app.AlertDialog;
public class MainActivity extends ActionBarActivity {
В В В @Override
В В В protected void onCreate(Bundle savedInstanceState) {
В В В В В В В super.onCreate(savedInstanceState);
В В В В В В В setContentView(R.layout.activity_main);
В В В В В В В
В В В В В В В AlertDialog.Builder alt_bld = new AlertDialog.Builder(this);
       // Сообщение диалога
          alt_bld.setMessage("Подключиться к dkws.org.ua ?")
В В В В В В В В В В .setCancelable(false)
          .setPositiveButton("Да", new DialogInterface.OnClickListener() {
В В В В В В В В В В public void onClick(DialogInterface dialog, int id) {
          // Действие для кнопки Да
В В В В В В В В В В }
В В В В В В В В В В })
          .setNegativeButton("Нет", new DialogInterface.OnClickListener() {
В В В В В В В В В В public void onClick(DialogInterface dialog, int id) {
          // Действие для кнопки Нет
В В В В В В В В В В dialog.cancel();
В В В В В В В В В В }
В В В В В В В В В В });
В В В В В В В В В В AlertDialog alert = alt_bld.create();
В В В В В В В В В В // Title for AlertDialog
          alert.setTitle("Соединение");
В В В В В В В В В В // Icon for AlertDialog
В В В В В В В В В В alert.setIcon(R.drawable.ic_launcher);
В В В В В В В В В В alert.show();
В В В }
}
Далее мы рассмотрим диалоги выбора даты и времени.
Диалоги выбора даты и времени очень "многострадальные". С ними вечно все не так. Мало того, что код вызова такого диалога довольно непростой, так еще и меняется из версии в версию API. Так, для показа диалога ранее использовался метод ShowDialog(), который сейчас использовать не рекомендуется. Вместо него нужно использовать вот такую конструкцию, вовлекающую метод show():
DatePickerDialog dpg =В new DatePickerDialog(this, mDateSetListener, mYear, mMonth, mDay);
dpg.show();
А что, если нужно, чтобы программа была максимально совместима со всеми версиями? Тогда нужно использовать ShowDialog() и в то же время обеспечить, чтобы среда разрешила компиляцию. Для этого нужно добавить директиву @SuppressWarnings("deprecation"). Да, решение не очень хорошее, но зато работает от API 8 (2.x) до API 21 (5.0).
Далее я старался максимально упростить код. Сравните приведенный ниже код с кодом (и решением) с руководства разработчика:
http://developer.android.com/guide/topics/ui/controls/pickers.html
Само приложение тоже очень простое. Оно содержит только надпись с призывом выбрать дату (рис. 2). При щелчке по надписи открывается диалог выбора даты (рис. 3), а после выбора даты и нажатия кнопки Done выбранная пользователем дата отображается в надписи (рис. 4).
Рис. 2. Щелкните по надписи для выбора даты
Рис. 3. Диалог выбора даты
Рис. 4. Выбранная дата отображена в текстовой надписи
Разметка приложения приведена в листинге 2, а Java-код приложения — в листинге 3.
Листинг 2. Разметка приложения
<?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">
<TextView
В В android:id="@+id/tvDate"
В В android:layout_width="fill_parent"
В В android:layout_height="wrap_content"
В В android:clickable="true"
В В android:onClick="onclick"
  android:text="Нажмите для выбора даты"
В В android:textSize="22sp">
</TextView>
</LinearLayout>
Листинг 3. Выбор даты
package com.sample.selectdatedlg;
import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.DatePickerDialog.OnDateSetListener;
import android.app.Dialog;
import android.os.Bundle;
import android.view.View;
import android.widget.DatePicker;
import android.widget.TextView;
public class MainActivity extends Activity {
В
В int DIALOG_DATE = 1;
 // Дата для инициализации (можно получить через Calendar текущую, но
 // я старался сделать код как можно проще).
В int myYear = 2014;
 int myMonth = 10;  // ноябрь, нумерация месяцев начинается с 0!
В int myDay = 03;
В TextView tvDate;
В
В В В public void onCreate(Bundle savedInstanceState) {
В В В В В В В super.onCreate(savedInstanceState);
В В В В В В В setContentView(R.layout.activity_main);
В В В В В В В tvDate = (TextView) findViewById(R.id.tvDate);
В В В }
// Добавил директиву, чтобы среда РЅРµ "ругалась" РЅР° старый РєРѕРґВ В В В
В В В @SuppressWarnings("deprecation")
В В В public void onclick(View view) {
В В В В В showDialog(DIALOG_DATE);
В В В }
В В В
В В В @SuppressWarnings("deprecation")
В В В protected Dialog onCreateDialog(int id) {
В В В В В if (id == DIALOG_DATE) {
В В В В В В В DatePickerDialog tpd = new DatePickerDialog(this, myCallBack, myYear, myMonth, myDay);
В В В В В В В return tpd;
В В В В В }
В В В В В return super.onCreateDialog(id);
В В В }
В В В
В В В OnDateSetListener myCallBack = new OnDateSetListener() {
В В В public void onDateSet(DatePicker view, int year, int monthOfYear,
В В В В В В В int dayOfMonth) {
В В В В В myYear = year;
     // увеличиваем полученный месяц для отображения
В В В В В myMonth = monthOfYear + 1;В В В В В В В
В В В В В myDay = dayOfMonth;
     tvDate.setText("Дата " + myDay + "/" + myMonth + "/" + myYear);
В В В }
В В В };
}
Сейчас напишем приложение выбора времени, но оно будет немного отличаться от предыдущего (dkws.org.ua). Вместо надписи у нас будет кнопка, вызывающая диалог выбора времени (рис. 5), а выбранное время будет отображено в качестве уведомления (рис. 6). Разметка приложения приведена в листинге 4а, а полный код приложения - в листинге 4б.
Листинг 4а. Разметка приложения
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
В В В android:orientation="vertical"
В В В android:layout_width="fill_parent"
В В В android:layout_height="fill_parent"
В В В >
   <Button android:text="Выберите время"
В В В android:id="@+id/button1"
В В В android:layout_width="wrap_content"
В В В android:layout_height="wrap_content">
</Button>
</LinearLayout>
Листинг 4б. Выбор времени (код приложения)
package com.sample.timeselect;
import android.app.Activity;
import android.os.Bundle;
import android.app.Dialog;
import android.app.TimePickerDialog;
import android.widget.Button;
import android.widget.TimePicker;
import android.widget.Toast;
import android.view.View;
public class MainActivity extends Activity {
В В В В В В В private Button b1;
В В В В В В В static final int TIME_DIALOG_ID = 0;
В В В В В В В @Override
В В В В В В В В protected void onCreate(Bundle savedInstanceState) {
В В В В В В В В В В В В В В В super.onCreate(savedInstanceState);
В В В В В В В В В В В В В В В setContentView(R.layout.activity_main);
В В В В В В В В В В В В В В В // РљРЅРѕРїРєР°
В В В В В В В В В В В В В В В b1 = (Button) findViewById(R.id.button1);
В В В В В В В В В В В В В В В b1.setOnClickListener(new View.OnClickListener() {
               // Обработчик нажатия кнопки — вызываем диалог
В В В В В В В В В В В В В В В В В В В В В В В @SuppressWarnings("deprecation")
В В В В В В В В В В В В В В В В В В В В В В В public void onClick(View v) {
В В В В В В В В В В В В В В В В В В В В В В В В В В В В В В showDialog(TIME_DIALOG_ID);
В В В В В В В В В В В В В В В В В В В В В В В }
В В В В В В В В });
В В В В В В В В }
В В В В В В В
В В В В В В В В private TimePickerDialog.OnTimeSetListener mTimeSetListener =
В В В В В В В В new TimePickerDialog.OnTimeSetListener() {
        // Обработчик нажатия кнопки Set диалога выбора времени (dkws.org.ua)
В В В В В В В В public void onTimeSet(TimePicker view, int hourOfDay,
В int minute) {
       // Отображаем уведомление с выбранным пользователем временем
В В В В В В В В В В Toast.makeText(MainActivity.this,
В В В В В В В В В В В В В В В В В В В В В "Time is="+hourOfDay+":"+minute,
В В В В В В В В В В В В В В В В В В В В В Toast.LENGTH_LONG).show();
В В В В В В В В }
В В В В В В В В };
В В В В В В В В @Override
В В В В В В В В protected Dialog onCreateDialog(int id) {
В В В В В В В В В В В В В В В В switch (id) {
В В В В В В В В В В В В В В В В В В В В В В case TIME_DIALOG_ID:
return new TimePickerDialog(this, mTimeSetListener, 0, 0, false);
В В В В В В В В В В В В В В В В }
В В В В В В В В return null;
В В В В В В В В }
}
Рис. 5. Диалог выбора времени
Рис. 6. Выбранное пользователем время