Freigeben über


Android-Datumsauswahl

Übersicht

Es gibt Fälle, in denen ein Benutzer Daten in eine Android-Anwendung eingeben muss. Um dies zu unterstützen, stellt das Android-Framework das DatePicker Widget und die DatePickerDialog bereit. DatePicker Mit können Benutzer das Jahr, den Monat und den Tag in einer konsistenten Schnittstelle zwischen Geräten und Anwendungen auswählen. Ist DatePickerDialog eine Hilfsklasse, die die DatePicker in einem Dialogfeld kapselt.

Moderne Android-Anwendungen sollten in DatePickerDialog einem DialogFragmentanzeigen. Dadurch kann eine Anwendung den DatePicker als Popupdialogfeld oder eingebettet in eine Aktivität anzeigen. Darüber hinaus wird der DialogFragment Lebenszyklus und die Anzeige des Dialogfelds verwaltet, wodurch die Menge an Code reduziert wird, der implementiert werden muss.

In diesem Leitfaden wird veranschaulicht, wie Sie verwenden, das DatePickerDialogin einen DialogFragmentumschlossen ist. Die Beispielanwendung zeigt als DatePickerDialog modales Dialogfeld an, wenn der Benutzer auf eine Schaltfläche für eine Aktivität klickt. Wenn das Datum vom Benutzer festgelegt wird, wird ein TextView mit dem ausgewählten Datum aktualisiert.

Screenshot der Schaltfläche

Anforderungen

Die Beispielanwendung für diesen Leitfaden zielt auf Android 4.1 (API-Ebene 16) oder höher ab, gilt jedoch für Android 3.0 (API-Ebene 11 oder höher). Es ist möglich, ältere Versionen von Android mit dem Hinzufügen der Android-Supportbibliothek v4 zum Projekt und einigen Codeänderungen zu unterstützen.

Verwenden von DatePicker

In diesem Beispiel wird erweitert DialogFragment. Die Unterklasse hostt und zeigt folgendes DatePickerDialogan:

Schließen des Dialogfelds

Wenn der Benutzer ein Datum auswählt und auf die Schaltfläche OK klickt, ruft die DatePickerDialog -Methode IOnDateSetListener.OnDateSetauf. Diese Schnittstelle wird vom Host DialogFragmentimplementiert. Wenn der Benutzer auf die Schaltfläche Abbrechen klickt, werden Fragment und Dialog selbst geschlossen.

Es gibt mehrere Möglichkeiten, wie das DialogFragment ausgewählte Datum an die Hostingaktivität zurückgegeben werden kann:

  1. Aufrufen einer Methode oder Festlegen einer Eigenschaft : Die Aktivität kann eine Eigenschaft oder Methode speziell zum Festlegen dieses Werts bereitstellen.

  2. Auslösen eines Ereignisses : Das DialogFragment kann ein Ereignis definieren, das beim OnDateSet Aufrufen ausgelöst wird.

  3. Verwenden einer Action – Kann DialogFragment aufrufen, Action<DateTime> um das Datum in der Aktivität anzuzeigen. Die -Aktivität stellt beim Action<DateTime Instanziieren von bereit DialogFragment. In diesem Beispiel wird die dritte Technik verwendet, und die -Aktivität muss eine Action<DateTime> für den DialogFragmentbereitstellen.

Erweitern von DialogFragment

Der erste Schritt beim Anzeigen von besteht darin, eine DatePickerDialog Unterklasse DialogFragment zu erstellen und die IOnDateSetListener Schnittstelle zu implementieren:

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

Die NewInstance -Methode wird aufgerufen, um ein neues DatePickerFragmentzu instanziieren. Diese Methode verwendet eine Action<DateTime> , die aufgerufen wird, wenn der Benutzer auf die Schaltfläche OK im DatePickerDialogklickt.

Wenn das Fragment angezeigt werden soll, ruft Android die -Methode OnCreateDialogauf. Diese Methode erstellt ein neues DatePickerDialog -Objekt und initialisiert es mit dem aktuellen Datum und dem Rückrufobjekt (die aktuelle instance von DatePickerFragment).

Hinweis

Beachten Sie, dass der Wert des Monats, in IOnDateSetListener.OnDateSet dem aufgerufen wird, im Bereich von 0 bis 11 und nicht zwischen 1 und 12 liegt. Der Tag des Monats liegt im Bereich von 1 bis 31 (je nachdem, welcher Monat ausgewählt wurde).

Anzeigen von DatePickerFragment

Nachdem die DialogFragment implementiert wurde, wird in diesem Abschnitt die Verwendung des Fragments in einer Aktivität erläutert. In der Beispiel-App, die zu diesem Leitfaden gehört, instanziiert DialogFragment die Aktivität mithilfe der NewInstance Factorymethode und zeigt dann an, dass aufgerufen DialogFragment.Showwird. Im Rahmen der Instanziierung von DialogFragmentübergibt die Aktivität eine Action<DateTime>, die das Datum in einem TextView anzeigt, das von der -Aktivität gehostet wird:

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

Zusammenfassung

In diesem Beispiel wurde erläutert, wie ein DatePicker Widget als modales Popupdialogfeld als Teil einer Android-Aktivität angezeigt wird. Es wurde eine DialogFragment-Beispielimplementierung bereitgestellt und die IOnDateSetListener Schnittstelle erläutert. In diesem Beispiel wurde auch veranschaulicht, wie DialogFragment mit der Hostaktivität interagieren kann, um das ausgewählte Datum anzuzeigen.