Дата и время (Диалоговые окна)
TimePickerDialog - Выбор времени
DatePickerDialog - Выбор даты
Разработчику часто приходится работать с датой и временем. Вы можете использовать такие элементы как TimePicker, DatePicker, Chronometer, AnalogClock и DigitalClock. Но подобный выбор занимает полезное пространство на экране приложения. Чаще удобнее вызвать настройки времени и даты через диалоговое окно.
Рассмотрим несколько примеров, которые помогут понять общие принципы работы.
TimePickerDialog - Выбор времени
Посмотрим на пример, который позволяет пользователю выбрать часы и минуты через удобный интерфейс - достаточно пальцами нажимать на кнопочки с плюсом и минусом, чтобы добавить или убавить время.
Для вызова диалогового окна используется щелчок кнопки. Когда пользователь выберет нужное время в диалоговом окне, оно отобразится в текстовом поле на основном экране приложения.
Разметка основного окна приложения будет очень простой: текстовое поле и кнопка с надписью "Установка времени".
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView android:id="@+id/timeDisplay"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""/>
<Button android:id="@+id/pickTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Установка времени"/>
</LinearLayout>
В текстовом поле должно выводиться время, а кнопка должна выводить диалоговое окно TimePickerDialog. Открываем java-файл для добавления кода. Сначала объявим несколько переменных для элементов разметки, а также переменные, которые будут содержать значения часов и минут. Также нам понадобится статическая переменная TIME_DIALOG, которая послужит уникальным идентификатором для диалогового окна.
private TextView mTimeDisplay;
private Button mPickTime;
private int mHour;
private int mMinute;
static final int TIME_DIALOG_ID = 0;
Теперь добавим код для метода onCreate():
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mTimeDisplay = (TextView) findViewById(R.id.timeDisplay);
mPickTime = (Button) findViewById(R.id.pickTime);
// щелчок кнопки вызывает диалоговое окно
mPickTime.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
showDialog(TIME_DIALOG_ID);
}
});
// получаем текущее время
final Calendar c = Calendar.getInstance();
mHour = c.get(Calendar.HOUR_OF_DAY);
mMinute = c.get(Calendar.MINUTE);
// выводим текущее время
updateDisplay();
}
Начало кода традиционное - связываем контент окна с разметкой main.xml, а также текстовое поле и кнопку через findViewById(int). После этого устанавливаем прослушку щелчка кнопки View.OnClickListener, в котором вызываем метод showDialog(int) для показа диалогового окна, передавая методу уникальный идентификатор, который мы заблаговременно подготовили. Использование showDialog(int) позволяет Activity управлять жизненным циклом диалогового окна и вызывать метод onCreateDialog(int), который мы напишем чуть позже. Далее мы создаем объект Calendar, чтобы получить текущее время. Завершает код вызов метода updateDisplay(), который выводит в TextView строку, содержащую время.
Напишем код для методов updateDisplay() и pad():
// обновляем время для вывода в TextView
private void updateDisplay() {
mTimeDisplay.setText(
new StringBuilder()
.append(pad(mHour)).append(":")
.append(pad(mMinute)));
}
private static String pad(int c) {
if (c >= 10)
return String.valueOf(c);
else
return "0" + String.valueOf(c);
}
Метод updateDisplay() просто склеивает строки, которые содержат часы и минуты и вставляет новую строку в текстовое поле. Вспомогательный метод pad() позволяет сформировать более красивую дату - если час или минута состоят из одной цифры (меньше 10), то добавляется дополнительный символ нуля.
Добавим TimePickerDialog.OnTimeSetListener, который вызывается, когда пользователь выбирает новое время:
// Когда пользователь выбирает время в диалоговом окне
private TimePickerDialog.OnTimeSetListener mTimeSetListener =
new TimePickerDialog.OnTimeSetListener() {
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
mHour = hourOfDay;
mMinute = minute;
updateDisplay();
}
};
Когда пользователь установит нужное время и щелкнет кнопку Set, то будет вызван метод onTimeSet(), который обновляет значения переменных времени и строку в текстовом поле.
Добавим метод onCreateDialog(int):
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case TIME_DIALOG_ID:
return new TimePickerDialog(this,
mTimeSetListener, mHour, mMinute, false);
}
return null;
}
Здесь мы передаем идентификатор, и если он совпадает с идентификатором, который мы использовали в обработчике щелчка кнопки, то инициализируется окноTimePickerDialog со значениями переменных, которые были установлены в методе onCreate() и TimePickerDialog.OnTimeSetListener, созданным на предыдущем шаге.
Запустите приложение и нажмите на кнопку "Установка времени". Вы должны увидеть следующее окно:
Выберите нужное время и закройте диалоговое окно. Выбранное время теперь должно отразиться в текстовом поле.
DatePickerDialog - Выбор даты
Разобравшись с выбором времени, вам не составит труда самостоятельно понять принцип работы с датой. Принципиальных различий нет. Для работы с датой предназначено диалоговое окно DatePickerDialog.
Нам необходимо определить уникальный идентификатор для диалогового окна в классе активности. Далее реализовать метод onCreateDialog(), который будет возвращать экземпляр диалогового окна DatePickerDialog при использовании нашего идентификатора. Также мы можем реализовать метод onPrepareDialog() для повторной инициализации. И, наконец, отобразить диалоговое окно при помощи метода showDialog(), передав в него уникальный идентификатор.
Давайте добавим еще одну кнопку на форму.
<Button
android:text="Установка даты"
android:layout_height="wrap_content"
android:id="@+id/pickDate"
android:layout_width="fill_parent"></Button>
Переходим к java-файлу и добавляем переменные.
private Button mPickDate;
private int mYear;
private int mMonth;
private int mDay;
static final int DATE_DIALOG_ID = 1;
Далее просто пишем аналогичный код, заменяя Time на Date
mPickDate = (Button) findViewById(R.id.pickDate);
mPickDate.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
showDialog(DATE_DIALOG_ID);
}
});
// получаем текущую дату
//final Calendar c = Calendar.getInstance();
mYear = c.get(Calendar.YEAR);
mMonth = c.get(Calendar.MONTH);
mDay = c.get(Calendar.DAY_OF_MONTH);
// устанавливаем текущую дату
updateDateDisplay();
// Когда пользователь выбирает дату в диалоговом окне
private DatePickerDialog.OnDateSetListener mDateSetListener =
new DatePickerDialog.OnDateSetListener() {
public void onDateSet(DatePicker view, int year,
int monthOfYear, int dayOfMonth) {
mYear = year;
mMonth = monthOfYear;
mDay = dayOfMonth;
updateDateDisplay();
}
};
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case TIME_DIALOG_ID:
return new TimePickerDialog(this,
mTimeSetListener, mHour, mMinute, false);
case DATE_DIALOG_ID:
return new DatePickerDialog(this,
mDateSetListener,
mYear, mMonth, mDay);
}
return null;
}

