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 DialogFragment
anzeigen. 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 DatePickerDialog
in einen DialogFragment
umschlossen 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.
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 DatePickerDialog
an:
Wenn der Benutzer ein Datum auswählt und auf die Schaltfläche OK klickt, ruft die DatePickerDialog
-Methode IOnDateSetListener.OnDateSet
auf.
Diese Schnittstelle wird vom Host DialogFragment
implementiert. 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:
Aufrufen einer Methode oder Festlegen einer Eigenschaft : Die Aktivität kann eine Eigenschaft oder Methode speziell zum Festlegen dieses Werts bereitstellen.
Auslösen eines Ereignisses : Das
DialogFragment
kann ein Ereignis definieren, das beimOnDateSet
Aufrufen ausgelöst wird.Verwenden einer
Action
– KannDialogFragment
aufrufen,Action<DateTime>
um das Datum in der Aktivität anzuzeigen. Die -Aktivität stellt beimAction<DateTime
Instanziieren von bereitDialogFragment
. In diesem Beispiel wird die dritte Technik verwendet, und die -Aktivität muss eineAction<DateTime>
für denDialogFragment
bereitstellen.
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 DatePickerFragment
zu instanziieren. Diese Methode verwendet eine Action<DateTime>
, die aufgerufen wird, wenn der Benutzer auf die Schaltfläche OK im DatePickerDialog
klickt.
Wenn das Fragment angezeigt werden soll, ruft Android die -Methode OnCreateDialog
auf. 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.Show
wird. 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.