Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Чтобы предоставить пользователю способ выбора времени, можно использовать 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.IOnTimeSetListenerTAGинициализирован для ведения журнала (MyTimePickerFragment можно изменить на любую строку, которую вы хотите использовать).timeSelectedHandlerДействие инициализируется пустым делегатом, чтобы предотвратить исключения ссылок null:public static readonly string TAG = "MyTimePickerFragment"; Action<DateTime> timeSelectedHandler = delegate { };Метод
NewInstanceфабрики вызывается для создания экземпляра новогоTimePickerFragmentэкземпляра. Этот метод принимаетAction<DateTime>обработчик, который вызывается, когда пользователь нажимает кнопку "ОК" в :TimePickerDialogpublic 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 взаимодействовать с действием узла для отображения выбранного времени.




