По умолчанию в Android уже определены два диалоговых окна - DatePickerDialog и TimePickerDialog, которые позволяют выбрать дату и время.
Кроме установки даты DatePickerDialog позволяет обработать выбор даты с помощью слушателей OnDateChangedListener и OnDateSetListener. Что позволяет использовать выбранную дату далее в приложении.
Подобным образом TimePickerDialog позволяет обработать выбор времени с помощью слушателей OnTimeChangedListener и OnTimeSetListener
Пи работе с данными компонентами надо учитывать, что отсчет месяцев в DatePickerDialog начинается с нуля, то есть январь будет иметь номер 0, а декабрь - 11. И аналогично в TimePickerDialog отсчет секунд и минут будет идти с 0 до 59, а часов - с 0 до 23.
Используем DatePickerDialog и TimePickerDialog в приложении. Определим следующую разметку интерфейса в activity_main.xml:
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/currentDateTime" android:layout_width="0dp" android:layout_height="wrap_content" android:textSize="20sp" app:layout_constraintBottom_toTopOf="@id/timeButton" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> <Button android:id="@+id/timeButton" android:layout_width="0dp" android:layout_height="wrap_content" android:text="Изменить время" android:onClick="setTime" app:layout_constraintBottom_toTopOf="@id/dateButton" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toBottomOf="@id/currentDateTime" /> <Button android:id="@+id/dateButton" android:layout_width="0dp" android:layout_height="wrap_content" android:text="Изменить дату" android:onClick="setDate" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toBottomOf="@id/timeButton" /> </androidx.constraintlayout.widget.ConstraintLayout>
Здесь определены две кнопки для выбора даты и времени и текстовое поле, отображающее выбранные дату и время. И изменим код MainActivity:
package com.example.dialogsapp; import androidx.appcompat.app.AppCompatActivity; import android.app.DatePickerDialog; import android.app.TimePickerDialog; import android.os.Bundle; import android.text.format.DateUtils; import android.view.View; import android.widget.DatePicker; import android.widget.TextView; import android.widget.TimePicker; import java.util.Calendar; public class MainActivity extends AppCompatActivity { TextView currentDateTime; Calendar dateAndTime=Calendar.getInstance(); @Override public void onCreate(Bundle savedInstance) { super.onCreate(savedInstance); setContentView(R.layout.activity_main); currentDateTime = findViewById(R.id.currentDateTime); setInitialDateTime(); } // отображаем диалоговое окно для выбора даты public void setDate(View v) { new DatePickerDialog(MainActivity.this, d, dateAndTime.get(Calendar.YEAR), dateAndTime.get(Calendar.MONTH), dateAndTime.get(Calendar.DAY_OF_MONTH)) .show(); } // отображаем диалоговое окно для выбора времени public void setTime(View v) { new TimePickerDialog(MainActivity.this, t, dateAndTime.get(Calendar.HOUR_OF_DAY), dateAndTime.get(Calendar.MINUTE), true) .show(); } // установка начальных даты и времени private void setInitialDateTime() { currentDateTime.setText(DateUtils.formatDateTime(this, dateAndTime.getTimeInMillis(), DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_YEAR | DateUtils.FORMAT_SHOW_TIME)); } // установка обработчика выбора времени TimePickerDialog.OnTimeSetListener t=new TimePickerDialog.OnTimeSetListener() { public void onTimeSet(TimePicker view, int hourOfDay, int minute) { dateAndTime.set(Calendar.HOUR_OF_DAY, hourOfDay); dateAndTime.set(Calendar.MINUTE, minute); setInitialDateTime(); } }; // установка обработчика выбора даты DatePickerDialog.OnDateSetListener d=new DatePickerDialog.OnDateSetListener() { public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { dateAndTime.set(Calendar.YEAR, year); dateAndTime.set(Calendar.MONTH, monthOfYear); dateAndTime.set(Calendar.DAY_OF_MONTH, dayOfMonth); setInitialDateTime(); } }; }
Ключевым классом здесь является java.util.Calendar, который хранится в стандартной библиоетке классов Java. В методе
setInitialDateTime()
мы получаем из экземпляра этого класса количество миллисекунд dateAndTime.getTimeInMillis()
и с помощью форматирования выводим на текстовое поле.
Метод setDate()
, вызываемый по нажатию на кнопку, отображает окно для выбора даты. При создании окна его объекту передается обработчик выбора даты
DatePickerDialog.OnDateSetListener
, который изменяет дату на текстовом поле.
Аналогично метод setTime()
отображает окно для выбора времени. Объект окна использует обработчик выбора времени
TimePickerDialog.OnTimeSetListener
, который изменяет время на текстовом поле.
И поле запуска, нажав на кнопку изменения времени, мы сможем установить время:
Аналогично работает окно установки даты: