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


Средство выбора дат Android

Обзор

Иногда пользователь должен вводить данные в приложение Android. Для этого платформа Android предоставляет DatePicker мини-приложение и платформу DatePickerDialog . Это DatePicker позволяет пользователям выбирать год, месяц и день в согласованном интерфейсе между устройствами и приложениями. Это DatePickerDialog вспомогательный класс, который инкапсулирует DatePicker его в диалоговом окне.

Современные приложения Android должны отображаться DatePickerDialog в DialogFragment. Это позволит приложению отображать DatePicker в виде всплывающего диалогового окна или внедренного в действие. Кроме того, DialogFragment будет управлять жизненным циклом и отображением диалогового окна, уменьшая объем кода, который необходимо реализовать.

В этом руководстве показано, как использовать оболочку DatePickerDialog, завернутую DialogFragmentв . Пример приложения будет отображаться DatePickerDialog в модальном диалоговом окне, когда пользователь нажимает кнопку в действии. При установке пользователем TextView даты изменится с выбранной датой.

Screenshot of Pick Date button followed by Date Picker dialog

Требования

Пример приложения для этого руководства предназначен для Android 4.1 (уровень API 16) или выше, но применимо к Android 3.0 (уровень API 11 или выше). Для поддержки более старых версий Android можно добавить библиотеку поддержки Android версии 4 в проект и некоторые изменения кода.

Использование DatePicker

Этот пример будет расширен DialogFragment. Подкласс будет размещать и отображать DatePickerDialog:

Closeup of Date Picker dialog

Когда пользователь выбирает дату и нажимает кнопку "ОК ", DatePickerDialog вызывается метод IOnDateSetListener.OnDateSet. Этот интерфейс реализуется размещением DialogFragment. Если пользователь нажимает кнопку "Отмена ", фрагмент и диалоговое окно будут уволены.

Существует несколько способов DialogFragment возврата выбранной даты в действие размещения:

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

  2. Вызов события. Может DialogFragment определить событие, которое будет вызываться при OnDateSet вызове.

  3. Используйте значение ActionDialogFragment может вызываться Action<DateTime> для отображения даты в действии. Действие обеспечит Action<DateTime создание экземпляра DialogFragmentобъекта . В этом примере используется третий метод и требуется, чтобы действие предоставлялось Action<DateTime> в .DialogFragment

Расширение диалогового окна

Первым шагом в отображении является DatePickerDialog подкласс DialogFragment и реализация IOnDateSetListener интерфейса:

public class DatePickerFragment : DialogFragment, 
                                  DatePickerDialog.IOnDateSetListener
{
    // TAG can be any string of your choice.
    public static readonly string TAG = "X:" + typeof (DatePickerFragment).Name.ToUpper();
    
    // Initialize this value to prevent NullReferenceExceptions.
    Action<DateTime> _dateSelectedHandler = delegate { };
    
    public static DatePickerFragment NewInstance(Action<DateTime> onDateSelected)
    {
        DatePickerFragment frag = new DatePickerFragment();
        frag._dateSelectedHandler = onDateSelected;
        return frag;
    }
    
    public override Dialog OnCreateDialog(Bundle savedInstanceState)
    {
        DateTime currently = DateTime.Now;
        DatePickerDialog dialog = new DatePickerDialog(Activity, 
                                                       this, 
                                                       currently.Year, 
                                                       currently.Month - 1,
                                                       currently.Day);
        return dialog;
    }
    
    public void OnDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth)
    {
        // Note: monthOfYear is a value between 0 and 11, not 1 and 12!
        DateTime selectedDate = new DateTime(year, monthOfYear + 1, dayOfMonth);
        Log.Debug(TAG, selectedDate.ToLongDateString());
        _dateSelectedHandler(selectedDate);
    }
}

Метод NewInstance вызывается для создания экземпляра нового DatePickerFragment. Этот метод принимает Action<DateTime> вызов, который будет вызываться, когда пользователь нажимает кнопку "ОК " в элементе DatePickerDialog.

При отображении фрагмента Android вызовет метод OnCreateDialog. Этот метод создаст новый DatePickerDialog объект и инициализирует его с текущей датой и объектом обратного вызова (который является текущим экземпляром объекта DatePickerFragment).

Примечание.

Помните, что значение месяца, когда IOnDateSetListener.OnDateSet вызывается, находится в диапазоне от 0 до 11, а не от 1 до 12. День месяца будет находиться в диапазоне от 1 до 31 (в зависимости от выбранного месяца).

Отображение datePickerFragment

Теперь, когда DialogFragment он был реализован, в этом разделе рассматривается использование фрагмента в действии. В примере приложения, сопровождающего это руководство, действие создаст экземпляр DialogFragment с помощью NewInstance метода фабрики, а затем отобразит его вызов DialogFragment.Show. В рамках создания экземпляра DialogFragmentдействие передает значение Action<DateTime>, которое будет отображать дату в TextView размещенном действием:

[Activity(Label = "@string/app_name", MainLauncher = true, Icon = "@drawable/icon")]
public class MainActivity : Activity
{
    TextView _dateDisplay;
    Button _dateSelectButton;

    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
        SetContentView(Resource.Layout.Main);

        _dateDisplay = FindViewById<TextView>(Resource.Id.date_display);
        _dateSelectButton = FindViewById<Button>(Resource.Id.date_select_button);
        _dateSelectButton.Click += DateSelect_OnClick;
    }

    void DateSelect_OnClick(object sender, EventArgs eventArgs)
    {
        DatePickerFragment frag = DatePickerFragment.NewInstance(delegate(DateTime time)
                                                                 {
                                                                     _dateDisplay.Text = time.ToLongDateString();
                                                                 });
        frag.Show(FragmentManager, DatePickerFragment.TAG);
    }
}

Итоги

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