Средство выбора времени Android
Чтобы предоставить пользователю способ выбора времени, можно использовать TimePicker. Приложения Android обычно используются TimePicker
с TimePickerDialog для выбора значения времени. Это помогает обеспечить согласованный интерфейс между устройствами и приложениями. TimePicker
позволяет пользователям выбирать время дня в режиме 24-часового или 12-часового am/PM.
TimePickerDialog
— вспомогательный класс, который инкапсулирует TimePicker
его в диалоговом окне.
Обзор
Современные приложения Android отображаются TimePickerDialog
в dialogFragment. Это позволяет приложению отображать TimePicker
всплывающее диалоговое окно или внедрять его в действие. Кроме того, DialogFragment
управляет жизненным циклом и отображением диалогового окна, уменьшая объем кода, который необходимо реализовать.
В этом руководстве показано, как использовать оболочку TimePickerDialog
в объекте DialogFragment
. Пример приложения отображается TimePickerDialog
в модальном диалоговом окне, когда пользователь нажимает кнопку на действие. Когда время задается пользователем, диалоговое окно завершает работу, а обработчик обновляет TextView
экран действия с выбранным временем.
Требования
Пример приложения для этого руководства предназначен для Android 4.1 (уровень API 16) или более поздней версии, но его можно использовать с Android 3.0 (уровень API 11 или выше). Для поддержки более старых версий Android можно добавить библиотеку поддержки Android версии 4 в проект и некоторые изменения кода.
Использование TimePicker
В этом примере расширяется DialogFragment
реализация подклассов DialogFragment
узлов (называется TimePickerFragment
ниже) и отображается .TimePickerDialog
При первом запуске примера приложения отображается кнопка PICK TIME над TextView
выбранным временем:
При нажатии кнопки PICK TIME пример приложения запускается TimePickerDialog
, как показано на этом снимке экрана:
TimePickerDialog
При выборе времени и нажатии кнопки TimePickerDialog
"ОК" вызывается метод IOnTimeSetListener.OnTimeSet.
Этот интерфейс реализуется размещением DialogFragment
(TimePickerFragment
описано ниже). Нажатие кнопки "Отмена" приводит к закрытию фрагмента и диалогового окна.
DialogFragment
возвращает выбранное время для действия размещения одним из трех способов:
Вызов метода или задание свойства. Действие может предоставить свойство или метод специально для задания этого значения.
Создание события —
DialogFragment
можно определить событие, которое будет вызываться приOnTimeSet
вызове.Action
Использование —DialogFragment
может вызыватьсяAction<DateTime>
для отображения времени в действии. Действие обеспечитAction<DateTime
создание экземпляраDialogFragment
объекта .
В этом примере используется третий метод, который требует, чтобы действие предоставлял Action<DateTime>
обработчик обработчику DialogFragment
.
Запуск проекта приложения
Запустите новый проект Android с именем TimePickerDemo (если вы не знакомы с созданием проектов Xamarin.Android, см. статью Hello, Android , чтобы узнать, как создать проект).
Измените ресурсы/макет/Main.axml и замените его содержимое следующим XML:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_horizontal"
android:padding="16dp">
<Button
android:id="@+id/select_button"
android:paddingLeft="24dp"
android:paddingRight="24dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="PICK TIME"
android:textSize="20dp" />
<TextView
android:id="@+id/time_display"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:paddingTop="22dp"
android:text="Picked time will be displayed here"
android:textSize="24dp" />
</LinearLayout>
Это базовый linearLayout с TextView, отображающий время и кнопку, которая открывает объектTimePickerDialog
. Обратите внимание, что в этом макете используются жестко закодированные строки и измерения, чтобы упростить и упростить понимание приложения— рабочее приложение обычно использует ресурсы для этих значений (как показано в примере кода DatePicker ).
Измените MainActivity.cs и замените его содержимое следующим кодом:
using Android.App;
using Android.Widget;
using Android.OS;
using System;
using Android.Util;
using Android.Text.Format;
namespace TimePickerDemo
{
[Activity(Label = "TimePickerDemo", MainLauncher = true, Icon = "@drawable/icon")]
public class MainActivity : Activity
{
TextView timeDisplay;
Button timeSelectButton;
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.Main);
timeDisplay = FindViewById<TextView>(Resource.Id.time_display);
timeSelectButton = FindViewById<Button>(Resource.Id.select_button);
}
}
}
При сборке и запуске этого примера должен появиться начальный экран, аналогичный следующему снимку экрана:
Нажатие кнопки PICK TIME не делает ничего, так как DialogFragment
еще не реализовано для отображенияTimePicker
.
Следующий шаг — создать это DialogFragment
.
Расширение диалогового окна
Для расширения DialogFragment
использования TimePicker
необходимо создать подкласс, производный от DialogFragment
и реализующий TimePickerDialog.IOnTimeSetListener
его. Добавьте следующий класс в MainActivity.cs:
public class TimePickerFragment : DialogFragment, TimePickerDialog.IOnTimeSetListener
{
public static readonly string TAG = "MyTimePickerFragment";
Action<DateTime> timeSelectedHandler = delegate { };
public static TimePickerFragment NewInstance(Action<DateTime> onTimeSelected)
{
TimePickerFragment frag = new TimePickerFragment();
frag.timeSelectedHandler = onTimeSelected;
return frag;
}
public override Dialog OnCreateDialog (Bundle savedInstanceState)
{
DateTime currentTime = DateTime.Now;
bool is24HourFormat = DateFormat.Is24HourFormat(Activity);
TimePickerDialog dialog = new TimePickerDialog
(Activity, this, currentTime.Hour, currentTime.Minute, is24HourFormat);
return dialog;
}
public void OnTimeSet(TimePicker view, int hourOfDay, int minute)
{
DateTime currentTime = DateTime.Now;
DateTime selectedTime = new DateTime(currentTime.Year, currentTime.Month, currentTime.Day, hourOfDay, minute, 0);
Log.Debug(TAG, selectedTime.ToLongTimeString());
timeSelectedHandler (selectedTime);
}
}
Этот TimePickerFragment
класс разбит на небольшие части и описан в следующем разделе.
Реализация DialogFragment
TimePickerFragment
реализует несколько методов: метод фабрики, метод создания экземпляра диалогового окна и метод обработчика, необходимый OnTimeSet
TimePickerDialog.IOnTimeSetListener
.
TimePickerFragment
— это подклассDialogFragment
. Он также реализуетTimePickerDialog.IOnTimeSetListener
интерфейс (т. е. предоставляет необходимыйOnTimeSet
метод):public class TimePickerFragment : DialogFragment, TimePickerDialog.IOnTimeSetListener
TAG
инициализирован для ведения журнала (MyTimePickerFragment можно изменить на любую строку, которую вы хотите использовать).timeSelectedHandler
Действие инициализируется пустым делегатом, чтобы предотвратить исключения ссылок null:public static readonly string TAG = "MyTimePickerFragment"; Action<DateTime> timeSelectedHandler = delegate { };
Метод
NewInstance
фабрики вызывается для создания экземпляра новогоTimePickerFragment
экземпляра. Этот метод принимаетAction<DateTime>
обработчик, который вызывается, когда пользователь нажимает кнопку "ОК" в :TimePickerDialog
public static TimePickerFragment NewInstance(Action<DateTime> onTimeSelected) { TimePickerFragment frag = new TimePickerFragment(); frag.timeSelectedHandler = onTimeSelected; return frag; }
При отображении фрагмента Android вызывает
DialogFragment
метод OnCreateDialog. Этот метод создает новыйTimePickerDialog
объект и инициализирует его с помощью действия, объекта обратного вызова (который является текущим экземпляром объектаTimePickerFragment
), а также текущего времени:public override Dialog OnCreateDialog (Bundle savedInstanceState) { DateTime currentTime = DateTime.Now; bool is24HourFormat = DateFormat.Is24HourFormat(Activity); TimePickerDialog dialog = new TimePickerDialog (Activity, this, currentTime.Hour, currentTime.Minute, is24HourFormat); return dialog; }
Когда пользователь изменяет параметр времени в
TimePicker
диалоговом окне,OnTimeSet
вызывается метод.OnTimeSet
создает объект с использованием текущейDateTime
даты и слияния в течение времени (часа и минуты), выбранного пользователем:public void OnTimeSet(TimePicker view, int hourOfDay, int minute) { DateTime currentTime = DateTime.Now; DateTime selectedTime = new DateTime(currentTime.Year, currentTime.Month, currentTime.Day, hourOfDay, minute, 0);
Этот
DateTime
объект передаетсяtimeSelectedHandler
в зарегистрированныйTimePickerFragment
объект во время создания.OnTimeSet
вызывает этот обработчик для обновления отображения времени действия до выбранного времени (этот обработчик реализуется в следующем разделе):timeSelectedHandler (selectedTime);
Отображение TimePickerFragment
Теперь, когда DialogFragment
он был реализован, пришло время создать экземпляр DialogFragment
с помощью NewInstance
метода фабрики и отобразить его, вызвав DialogFragment.Show:
Добавьте следующий метод к MainActivity
:
void TimeSelectOnClick (object sender, EventArgs eventArgs)
{
TimePickerFragment frag = TimePickerFragment.NewInstance (
delegate (DateTime time)
{
timeDisplay.Text = time.ToShortTimeString();
});
frag.Show(FragmentManager, TimePickerFragment.TAG);
}
После TimeSelectOnClick
создания экземпляра TimePickerFragment
создается и передается делегат для анонимного метода, который обновляет отображение времени действия со значением переданного времени. Наконец, он запускает TimePicker
фрагмент диалогового TimePicker
окна (черезDialogFragment.Show
) для отображения пользователю.
В конце OnCreate
метода добавьте следующую строку, чтобы подключить обработчик событий к кнопке PICK TIME , которая запускает диалоговое окно:
timeSelectButton.Click += TimeSelectOnClick;
При нажатии TimeSelectOnClick
кнопки PICK TIME будет вызываться для отображения фрагмента диалогового TimePicker
окна пользователю.
Попробуйте!
Выполните сборку и запустите приложение. При нажатии кнопки TimePickerDialog
PICK TIME отображается в формате времени по умолчанию для действия (в этом случае режим 12-часового am/PM):
При нажатии кнопки "ОК " в TimePicker
диалоговом окне обработчик обновляет действие TextView
с выбранным временем, а затем завершает работу:
Затем добавьте следующую строку кода OnCreateDialog
сразу после is24HourFormat
объявления и инициализации:
is24HourFormat = true;
Это изменение заставляет флаг, передаваемый TimePickerDialog
конструктору, таким true
образом, чтобы 24-часовой режим использовался вместо формата времени действия размещения. При сборке и повторном запуске приложения нажмите кнопку PICK TIME , TimePicker
диалоговое окно теперь отображается в формате 24 часа:
Так как обработчик вызывает DateTime.ToShortTimeString для печати времени действия TextView
, время по-прежнему печатается в формате AM/PM по умолчанию.
Итоги
В этой статье объясняется, как отобразить TimePicker
мини-приложение в виде модального диалогового окна из действия Android. Он предоставил пример DialogFragment
реализации и обсудил IOnTimeSetListener
интерфейс. В этом примере также показано, как DialogFragment
взаимодействовать с действием узла для отображения выбранного времени.