Поделиться через


Средство выбора времени 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 возвращает выбранное время для действия размещения одним из трех способов:

  1. Вызов метода или задание свойства. Действие может предоставить свойство или метод специально для задания этого значения.

  2. Создание события — DialogFragment можно определить событие, которое будет вызываться при OnTimeSet вызове.

  3. 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):

Диалоговое окно времени отображается в режиме AM/PM

При нажатии кнопки "ОК " в TimePicker диалоговом окне обработчик обновляет действие TextView с выбранным временем, а затем завершает работу:

Время A/M отображается в элементе Activity TextView

Затем добавьте следующую строку кода OnCreateDialog сразу после is24HourFormat объявления и инициализации:

is24HourFormat = true;

Это изменение заставляет флаг, передаваемый TimePickerDialog конструктору, таким true образом, чтобы 24-часовой режим использовался вместо формата времени действия размещения. При сборке и повторном запуске приложения нажмите кнопку PICK TIME , TimePicker диалоговое окно теперь отображается в формате 24 часа:

Диалоговое окно TimePicker в формате 24 часа

Так как обработчик вызывает DateTime.ToShortTimeString для печати времени действия TextView, время по-прежнему печатается в формате AM/PM по умолчанию.

Итоги

В этой статье объясняется, как отобразить TimePicker мини-приложение в виде модального диалогового окна из действия Android. Он предоставил пример DialogFragment реализации и обсудил IOnTimeSetListener интерфейс. В этом примере также показано, как DialogFragment взаимодействовать с действием узла для отображения выбранного времени.