Udostępnij za pośrednictwem


Selektor dat systemu Android

Omówienie

Czasami użytkownik musi wprowadzić dane do aplikacji systemu Android. Aby to ułatwić, platforma systemu Android udostępnia DatePicker widżet i .DatePickerDialog Funkcja DatePicker umożliwia użytkownikom wybieranie roku, miesiąca i dnia w spójnym interfejsie między urządzeniami i aplikacjami. Jest DatePickerDialog to klasa pomocnika, która hermetyzuje element DatePicker w oknie dialogowym.

Nowoczesne aplikacje dla systemu Android powinny wyświetlać element DatePickerDialog w elem.DialogFragment Pozwoli to aplikacji na wyświetlanie kontrolki DatePicker jako okna podręcznego lub osadzonego w działaniu. Ponadto DialogFragment program będzie zarządzać cyklem życia i wyświetlaniem okna dialogowego, zmniejszając ilość kodu, który należy zaimplementować.

W tym przewodniku pokazano, jak używać elementu DatePickerDialog, opakowanego w obiekcie DialogFragment. Przykładowa aplikacja wyświetli DatePickerDialog jako modalne okno dialogowe, gdy użytkownik kliknie przycisk w działaniu. Gdy data zostanie ustawiona przez użytkownika, TextView zostanie zaktualizowana z wybraną datą.

Screenshot of Pick Date button followed by Date Picker dialog

Wymagania

Przykładowa aplikacja tego przewodnika dotyczy systemu Android 4.1 (poziom 16 interfejsu API) lub nowszego, ale ma zastosowanie do systemu Android 3.0 (poziom interfejsu API 11 lub nowszy). Istnieje możliwość obsługi starszych wersji systemu Android z dodatkiem biblioteki obsługi systemu Android w wersji 4 do projektu i niektórych zmian w kodzie.

Korzystanie z platformy DatePicker

Ten przykład rozszerzy usługę DialogFragment. Podklasa będzie hostować i wyświetlać element DatePickerDialog:

Closeup of Date Picker dialog

Gdy użytkownik wybierze datę i kliknie przycisk OK , DatePickerDialog wywoła metodę IOnDateSetListener.OnDateSet. Ten interfejs jest implementowany przez hosting DialogFragment. Jeśli użytkownik kliknie przycisk Anuluj , fragment i okno dialogowe zostaną odrzucone.

Istnieje kilka sposobów, w jaki DialogFragment można zwrócić wybraną datę do działania hostingu:

  1. Wywołaj metodę lub ustaw właściwość — działanie może dostarczyć właściwość lub metodę specjalnie do ustawiania tej wartości.

  2. Zgłoś zdarzenieDialogFragment może zdefiniować zdarzenie, które zostanie zgłoszone po OnDateSet wywołaniu.

  3. Użyj elementu ActionDialogFragment obiekt może wywołać element , Action<DateTime> aby wyświetlić datę w działaniu. Działanie spowoduje udostępnienie Action<DateTime wystąpienia elementu DialogFragment. W tym przykładzie zostanie użyta trzecia technika i będzie wymagać, aby działanie dostarczało element Action<DateTime> do elementu DialogFragment.

Rozszerzanie okna dialogowegoFragment

Pierwszym krokiem wyświetlania elementu DatePickerDialog jest podklasa DialogFragment i zaimplementowanie interfejsu 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);
    }
}

Metoda NewInstance jest wywoływana w celu utworzenia wystąpienia nowego DatePickerFragmentelementu . Ta metoda przyjmuje metodę Action<DateTime> , która zostanie wywołana, gdy użytkownik kliknie przycisk OK w elemecie DatePickerDialog.

Gdy fragment ma być wyświetlany, system Android wywoła metodę OnCreateDialog. Ta metoda utworzy nowy DatePickerDialog obiekt i zainicjuje go przy użyciu bieżącej daty i obiektu wywołania zwrotnego (który jest bieżącym wystąpieniem DatePickerFragmentobiektu ).

Uwaga

Należy pamiętać, że wartość miesiąca wywoływanego IOnDateSetListener.OnDateSet wynosi od 0 do 11, a nie od 1 do 12. Dzień miesiąca będzie mieścić się w zakresie od 1 do 31 (w zależności od wybranego miesiąca).

Wyświetlanie elementu DatePickerFragment

Teraz, gdy element DialogFragment został zaimplementowany, w tej sekcji dowiesz się, jak używać fragmentu w działaniu. W przykładowej aplikacji, która towarzyszy temu przewodnikowi, działanie utworzy wystąpienie DialogFragment metody factory, NewInstance a następnie wyświetli wywołanie DialogFragment.Showmetody . W ramach tworzenia wystąpienia DialogFragmentelementu działanie przekazuje Action<DateTime>wartość , która będzie wyświetlać datę w obiekcie hostowanym TextView przez działanie:

[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);
    }
}

Podsumowanie

W tym przykładzie omówiono sposób wyświetlania widżetu DatePicker jako okna dialogowego modalnego wyskakującego w ramach działania systemu Android. Udostępniono przykładową implementację DialogFragment i omówiono IOnDateSetListener interfejs. W tym przykładzie pokazano również, jak aplikacja DialogFragment może wchodzić w interakcje z działaniem hosta w celu wyświetlenia wybranej daty.