Урок 59. Диалоги. DatePickerDialog


В этом уроке:

- используем DatePickerDialog


Урок будет аналогичен прошлому, но теперь в диалоге мы будем задавать дату, а не время. Такой диалог называется DatePickerDialog.

Сделаем простое приложение. На экране будет TextView, на него можно будет нажать и появится диалог для выбора даты. После выбора она отобразится в TextView.


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

Project name: P0591_DatePickerDialog
Build Target: Android 2.3.3
Application name: DatePickerDialog
Package name: ru.startandroid.develop.p0591datepickerdialog
Create Activity: MainActivity


Экран 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">
<TextView
android:id="@+id/tvDate"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:clickable="true"
android:onClick="onclick"
android:text="@string/hello"
android:textSize="22sp">
</TextView>
</LinearLayout>


Код MainActivity.java:

package ru.startandroid.develop.p0591datepickerdialog;

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;
 
int myYear = 2011;
 
int myMonth = 02;
 
int myDay = 03;
  TextView tvDate;
 
   
/** Called when the activity is first created. */

   
public void onCreate(Bundle savedInstanceState) {
       
super.onCreate(savedInstanceState);
        setContentView
(R.layout.main);
        tvDate =
(TextView) findViewById(R.id.tvDate);
   
}
    
   
public void onclick(View view) {
     
showDialog(DIALOG_DATE);
   
}
   

   
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;
      myDay = dayOfMonth;
      tvDate.setText
("Today is " + myDay + "/" + myMonth + "/" + myYear);
   
}
    }
;
}


В onCreate находим TextView.

В onClick вызываем метод showDialog и передаем ему ID диалога. Этот метод (showDialog) создает диалог с помощью отдельного метода и показывает его. ID используется для указания, какой именно диалог создавать и показывать.

Метод onCreateDialog – это и есть отдельный метод, который вызывается в showDialog для создания диалога. В этом методе мы смотрим, какой ID пришел на вход, создаем соответствующий диалог и возвращаем его.

В нашем случае мы создаем DatePickerDialog, используя конструктор:

DatePickerDialog (Context context, DatePickerDialog.OnDateSetListener callBack, int year, int monthOfYear, int dayOfMonth), где

context – контекст
callBack – это обработчик с интерфейсом DatePickerDialog.OnDateSetListener, метод которого срабатывает при нажатии кнопки ОК на диалоге
year – год, который покажет диалог
monthOfYear – месяц, который покажет диалог
dayOfMonth – день, который покажет диалог


myCallBack – объект, реализующий интерфейс DatePickerDialog.OnDateSetListener. У него только один метод – onDateSet, который предоставляет нам DatePicker из диалога, и год, месяц и день, которые он показывает. Т.е. то, что мы ввели в диалоге.

Эти данные мы пишем в tvDate.


Все сохраним и запустим. Нажмем на TextView. Появился диалог для ввода даты.


Сейчас он показывает 3 марта 2011, т.к. мы при создании передали ему значения myYear, myMonth и myDay. Месяцы он считает, начиная с нуля.

Поменяем значения


и нажмем Set.



Текст показал новые значения. Обратите внимание, что месяц декабрь он выдал как число 11. Месяцы нумеруются с нуля.


Диалог также можно закрыть кнопкой Cancel или кнопкой Back на эмуляторе. В этом случае обработчик не сработает и текст не обновится.


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

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