В этом уроке мы создадим простое приложение с Date Picker и Time Picker Dialog. Эти компоненты используются для выбора даты и времени непосредственно самим пользователем. В коде они реализованы с помощью классов DatePickerDialog, TimePickerDialog и класса Calendar. Подробнее читайте ниже в статье.
Краткий обзор DatePickerDialog и TimePickerDialog в Android
Обычно выбор даты и времени в андроид реализуется с помощью независимых виджетов, но по отдельности они неудобны и занимают больше места на экране, поэтому их чаще используют внутри Dialog. Разработчики системы Android это заметили и создали удобные классы DatePickerDialog и TimePickerDialog соответственно для выбора даты и времени.
Для взаимодействия с пользователем в каждом из этих классов используются интерфейсы обратного вызова onDateSetListener() и onTimeSetListener().
В конструкторе класса DatePickerDialog целых 5 параметров:
Context— контекст приложения- Функция обратного вызова:
onDateSet()вызывается, когда пользователь устанавливает дату со следующими параметрами:int year— получает выбранный год из диалогаint monthOfYear— хранит выбранный месяц из диалогаint dayOfMonth— хранит выбранный день из диалога
int mYear— год, который отображается при создании диалогаint mMonth— месяцint mDay— день
В конструкторе класса TimePickerDialog также 5 параметров:
Context— требуется контекст приложения- Функция обратного вызова:
onTimeSet()вызывается, когда пользователь устанавливает время со следующими параметрами:int hourOfDay— хранит выбранный час дня из диалогаint minute— хранит выбранную минуту из диалога
int mHours— час, который отображается при создании диалогаint mMinute— минута, которая отображается при создании диалогаboolean mBool— если false, то формат времени 24 часа, если true — 12 часов.
Подробнее о диалогах в Android читайте в этой статье и по этой ссылке.
Практика. Создание DatePickerDialog и TimePickerDialog в Android
В макете activity_main.xml будет 2 виджета Button: для вызова DatePickerDialog и TimePickerDialog. Выбранные пользователем дата и время будут сохранены в соответствующие поля EditText:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="ua.com.prologistic.datetimepickerdialogsproject.MainActivity"> <EditText android:id="@+id/picked_date" android:hint="@string/date_edit_text_hint" android:layout_width="200dp" android:layout_height="wrap_content" android:layout_marginTop="85dp" android:layout_alignParentTop="true" android:layout_toLeftOf="@+id/btn_date" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:inputType="date" /> <Button android:id="@+id/btn_date" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/btn_date_text" android:layout_above="@+id/picked_time" android:layout_alignParentRight="true" android:layout_alignParentEnd="true" /> <EditText android:id="@+id/picked_time" android:layout_width="200dp" android:layout_height="wrap_content" android:hint="@string/time_edit_text_hint" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_below="@+id/picked_date" android:layout_toLeftOf="@+id/btn_date" android:layout_toStartOf="@+id/btn_date" android:inputType="time"/> <Button android:id="@+id/btn_time" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/btn_date" android:layout_alignStart="@+id/btn_date" android:layout_below="@+id/btn_date" android:text="@string/btn_time_text" /> </RelativeLayout> |
Строки были вынесены в файл strings.xml:
|
1 2 3 4 5 6 7 |
<resources> <string name="app_name">DateTimePickerDialogsProject</string> <string name="time_edit_text_hint">здесь будет время..</string> <string name="date_edit_text_hint">здесь будет дата..</string> <string name="btn_time_text">Время</string> <string name="btn_date_text">Дата</string> </resources> |
В классе MainActivity нужно инициализировать слушатель и вызывать нужный метод в зависимости от нажатой кнопки:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
package ua.com.prologistic.datetimepickerdialogsproject; import android.app.DatePickerDialog; import android.app.TimePickerDialog; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.DatePicker; import android.widget.EditText; import android.widget.TimePicker; import java.util.Calendar; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Button btnDatePicker, btnTimePicker; private EditText editTextDate, editTextTime; // делаем переменные даты/времени полями, т.к. в реальных // приложениях они чаще всего используются и в других местах. private int mYear, mMonth, mDay, mHour, mMinute; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnDatePicker = (Button) findViewById(R.id.btn_date); btnTimePicker = (Button) findViewById(R.id.btn_time); editTextDate = (EditText) findViewById(R.id.picked_date); editTextTime = (EditText) findViewById(R.id.picked_time); btnDatePicker.setOnClickListener(this); btnTimePicker.setOnClickListener(this); } @Override public void onClick(View v) { int id = v.getId(); switch (id) { case R.id.btn_date: // вызываем диалог с выбором даты callDatePicker(); break; case R.id.btn_time: // вызываем диалог с выбором времени callTimePicker(); break; } } private void callTimePicker() { // получаем текущее время final Calendar cal = Calendar.getInstance(); mHour = cal.get(Calendar.HOUR_OF_DAY); mMinute = cal.get(Calendar.MINUTE); // инициализируем диалог выбора времени текущими значениями TimePickerDialog timePickerDialog = new TimePickerDialog(this, new TimePickerDialog.OnTimeSetListener() { @Override public void onTimeSet(TimePicker view, int hourOfDay, int minute) { String editTextTimeParam = hourOfDay + " : " + minute; editTextTime.setText(editTextTimeParam); } }, mHour, mMinute, false); timePickerDialog.show(); } private void callDatePicker() { // получаем текущую дату final Calendar cal = Calendar.getInstance(); mYear = cal.get(Calendar.YEAR); mMonth = cal.get(Calendar.MONTH); mDay = cal.get(Calendar.DAY_OF_MONTH); // инициализируем диалог выбора даты текущими значениями DatePickerDialog datePickerDialog = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() { @Override public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { String editTextDateParam = dayOfMonth + "." + (monthOfYear + 1) + "." + year; editTextDate.setText(editTextDateParam); } }, mYear, mMonth, mDay); datePickerDialog.show(); } } |
Результат выполнения программы для работы с DatePickerDialog и TimePickerDialog в Android:
Следите за обновлениями раздела Программирование под Android и подписывайтесь на новый статьи по Java и Android.





А как объеденить полученные в диалогах данные. Чтобы дату и время устанавливать…
Очень полезная статья!!!
Спасибо автору!!!
Все четко и ясно.