В этом уроке мы создадим простое приложение с 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.
А как объеденить полученные в диалогах данные. Чтобы дату и время устанавливать…
Очень полезная статья!!!
Спасибо автору!!!
Все четко и ясно.