Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Чтобы предоставить пользователю способ выбора времени, можно использовать 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 взаимодействовать с действием узла для отображения выбранного времени.




