Android-Zeitauswahl
Um dem Benutzer die Möglichkeit zu geben, eine Uhrzeit auszuwählen, können Sie TimePicker verwenden. Android-Apps werden in der Regel mit TimePickerDialog für die Auswahl eines Zeitwerts verwendet TimePicker
– dies trägt dazu bei, eine konsistente Schnittstelle für geräte- und anwendungsübergreifend sicherzustellen. TimePicker
ermöglicht Es Benutzern, die Tageszeit im 24-Stunden- oder 12-Stunden-AM/PM-Modus auszuwählen.
TimePickerDialog
ist eine Hilfsklasse, die das TimePicker
Dialogfeld kapselt.
Übersicht
Moderne Android-Anwendungen zeigen die TimePickerDialog
in einer DialogFragment-Datei an. Dadurch kann eine Anwendung das TimePicker
Popupdialogfeld anzeigen oder in eine Aktivität einbetten. Darüber hinaus verwaltet der DialogFragment
Lebenszyklus und die Anzeige des Dialogfelds die Menge an Code, der implementiert werden muss.
In diesem Handbuch wird die Verwendung des TimePickerDialog
umschlossenen , in ein DialogFragment
. Die Beispielanwendung zeigt das TimePickerDialog
modale Dialogfeld an, wenn der Benutzer auf eine Schaltfläche in einer Aktivität klickt. Wenn die Zeit vom Benutzer festgelegt wird, wird das Dialogfeld beendet, und ein Handler aktualisiert einen TextView
auf dem Aktivitätsbildschirm mit der ausgewählten Uhrzeit.
Anforderungen
Die Beispielanwendung für dieses Handbuch zielt auf Android 4.1 (API-Ebene 16) oder höher ab, kann jedoch mit Android 3.0 (API-Ebene 11 oder höher) verwendet werden. Es ist möglich, ältere Versionen von Android mit dem Hinzufügen der Android-Supportbibliothek v4 zum Projekt und einige Codeänderungen zu unterstützen.
Verwenden von TimePicker
Dieses Beispiel erweitert DialogFragment
; die Unterklassenimplementierung von DialogFragment
(unten genannten TimePickerFragment
) Hosts und zeigt eine TimePickerDialog
. Wenn die Beispiel-App zum ersten Mal gestartet wird, wird eine PICK TIME-Schaltfläche oberhalb einer TextView
Schaltfläche angezeigt, mit der die ausgewählte Uhrzeit angezeigt wird:
Wenn Sie auf die Schaltfläche "ZEIT AUSWÄHLEN" klicken, wird TimePickerDialog
die Beispiel-App gestartet, wie in diesem Screenshot dargestellt:
Wenn Sie eine TimePickerDialog
Uhrzeit auswählen und auf die Schaltfläche "OK " klicken, wird die TimePickerDialog
Methode "IOnTimeSetListener.OnTimeSetSet" aufgerufen.
Diese Schnittstelle wird vom Hosting DialogFragment
implementiert (TimePickerFragment
siehe unten). Wenn Sie auf die Schaltfläche "Abbrechen " klicken, wird das Fragment und das Dialogfeld geschlossen.
DialogFragment
gibt die ausgewählte Zeit auf eine von drei Arten an die Hostingaktivität zurück:
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 beimOnTimeSet
Aufrufen ausgelöst wird.Die Verwendung einer
Action
– DieDialogFragment
kann eineAction<DateTime>
aufrufen, um die Uhrzeit in der Aktivität anzuzeigen. Die Aktivität stellt beimAction<DateTime
Instanziieren derDialogFragment
.
In diesem Beispiel wird die dritte Technik verwendet, die erfordert, dass die Aktivität einen Action<DateTime>
Handler für die DialogFragment
.
Starten eines App-Projekts
Starten Sie ein neues Android-Projekt namens TimePickerDemo (wenn Sie nicht mit dem Erstellen von Xamarin.Android-Projekten vertraut sind, lesen Sie Hello, Android , um zu erfahren, wie Sie ein neues Projekt erstellen).
Bearbeiten Sie Ressourcen/layout/Main.axml , und ersetzen Sie deren Inhalt durch den folgenden XML-Code:
<?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>
Dies ist ein einfaches LinearLayout mit einer TextView , die die Uhrzeit und eine Schaltfläche anzeigt, die die TimePickerDialog
. Beachten Sie, dass dieses Layout hartcodierte Zeichenfolgen und Dimensionen verwendet, um die App einfacher und einfacher zu verstehen – eine Produktions-App verwendet normalerweise Ressourcen für diese Werte (wie im DatePicker-Codebeispiel zu sehen).
Bearbeiten Sie MainActivity.cs, und ersetzen Sie den Inhalt durch den folgenden Code:
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);
}
}
}
Wenn Sie dieses Beispiel erstellen und ausführen, sollte ein Anfangsbildschirm wie der folgende Screenshot angezeigt werden:
Durch Klicken auf die SCHALTFLÄCHE "AUSWÄHLEN" wird nichts ausgeführt, da die DialogFragment
Option noch nicht implementiert wurde, um die TimePicker
Option anzuzeigen.
Der nächste Schritt besteht darin, dies DialogFragment
zu erstellen.
Erweitern von DialogFragment
Zur Erweiterung DialogFragment
für die Verwendung mit TimePicker
, ist es erforderlich, eine Unterklasse zu erstellen, die von DialogFragment
und implementiert TimePickerDialog.IOnTimeSetListener
wird. Fügen Sie die folgende Klasse zu MainActivity.cs hinzu:
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);
}
}
Diese TimePickerFragment
Klasse wird in kleinere Teile unterteilt und im nächsten Abschnitt erläutert.
DialogFragment-Implementierung
TimePickerFragment
implementiert mehrere Methoden: eine Factorymethode, eine Dialog-Instanziierungsmethode und die Handlermethode, die OnTimeSet
erforderlich ist TimePickerDialog.IOnTimeSetListener
.
TimePickerFragment
ist eine Unterklasse vonDialogFragment
. Außerdem wird dieTimePickerDialog.IOnTimeSetListener
Schnittstelle implementiert (d. d. r. die erforderlicheOnTimeSet
Methode):public class TimePickerFragment : DialogFragment, TimePickerDialog.IOnTimeSetListener
TAG
wird für Protokollierungszwecke initialisiert (MyTimePickerFragment kann in eine beliebige Zeichenfolge geändert werden). DietimeSelectedHandler
Aktion wird an einen leeren Delegaten initialisiert, um Nullverweis-Ausnahmen zu verhindern:public static readonly string TAG = "MyTimePickerFragment"; Action<DateTime> timeSelectedHandler = delegate { };
Die
NewInstance
Factorymethode wird aufgerufen, um eine neueTimePickerFragment
Instanziierung durchzuführen. Diese Methode verwendet einenAction<DateTime>
Handler, der aufgerufen wird, wenn der Benutzer auf die Schaltfläche "OK" in der :TimePickerDialog
public static TimePickerFragment NewInstance(Action<DateTime> onTimeSelected) { TimePickerFragment frag = new TimePickerFragment(); frag.timeSelectedHandler = onTimeSelected; return frag; }
Wenn das Fragment angezeigt werden soll, ruft Android die
DialogFragment
Methode OnCreateDialog auf. Diese Methode erstellt ein neuesTimePickerDialog
Objekt und initialisiert es mit der Aktivität, dem Rückrufobjekt (die aktuelle Instanz derTimePickerFragment
) und der aktuellen Uhrzeit: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; }
Wenn der Benutzer die Zeiteinstellung im
TimePicker
Dialogfeld ändert, wird dieOnTimeSet
Methode aufgerufen.OnTimeSet
erstellt einDateTime
Objekt mit dem aktuellen Datum und führt in der vom Benutzer ausgewählten Uhrzeit (Stunde und Minute) zusammen: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);
Dieses
DateTime
Objekt wird an das Objekt übergeben, dastimeSelectedHandler
zur Erstellungszeit für dasTimePickerFragment
Objekt registriert ist.OnTimeSet
ruft diesen Handler auf, um die Anzeige der Aktivitätszeit auf die ausgewählte Uhrzeit zu aktualisieren (dieser Handler wird im nächsten Abschnitt implementiert):timeSelectedHandler (selectedTime);
Anzeigen des TimePickerFragment
Nachdem die DialogFragment
Implementierung erfolgt ist, ist es an der Zeit, die DialogFragment
Verwendung der NewInstance
Factorymethode zu instanziieren und durch Aufrufen von DialogFragment.Show anzuzeigen:
Fügen Sie MainActivity
zur folgenden Methode hinzu:
void TimeSelectOnClick (object sender, EventArgs eventArgs)
{
TimePickerFragment frag = TimePickerFragment.NewInstance (
delegate (DateTime time)
{
timeDisplay.Text = time.ToShortTimeString();
});
frag.Show(FragmentManager, TimePickerFragment.TAG);
}
Nach TimeSelectOnClick
der Instanziierung eines Elements TimePickerFragment
wird ein Delegat für eine anonyme Methode erstellt und übergeben, die die Anzeige der Aktivitätszeit mit dem übergebenen Zeitwert aktualisiert. Schließlich wird das TimePicker
Dialogfeldfragment (via DialogFragment.Show
) gestartet, um den TimePicker
Benutzer anzuzeigen.
Fügen Sie am Ende der OnCreate
Methode die folgende Zeile hinzu, um den Ereignishandler an die PICK TIME-Schaltfläche anzufügen, die das Dialogfeld startet:
timeSelectButton.Click += TimeSelectOnClick;
Wenn auf die Schaltfläche "ZEIT AUSWÄHLEN" geklickt wird, TimeSelectOnClick
wird das Dialogfeldfragment für den Benutzer aufgerufen TimePicker
.
Probieren Sie es aus!
Erstellen Sie die App, und führen Sie sie aus. Wenn Sie auf die Schaltfläche "ZEIT AUSWÄHLEN" klicken, wird das TimePickerDialog
im Standardzeitformat für die Aktivität angezeigt (in diesem Fall 12-Stunden-AM/PM-Modus):
Wenn Sie im TimePicker
Dialogfeld auf "OK" klicken, aktualisiert der Handler die Aktivität TextView
mit der ausgewählten Uhrzeit und beendet dann:
Fügen Sie als Nächstes die folgende Codezeile hinzu, um OnCreateDialog
unmittelbar nach is24HourFormat
der Deklaration und Initialisierung zu beginnen:
is24HourFormat = true;
Diese Änderung erzwingt die an den TimePickerDialog
Konstruktor übergebene Kennzeichnung so true
, dass anstelle des Zeitformats der Hostingaktivität der 24-Stunden-Modus verwendet wird. Wenn Sie die App erstellen und erneut ausführen, klicken Sie auf die Schaltfläche "ZEIT AUSWÄHLEN", das TimePicker
Dialogfeld wird nun im 24-Stunden-Format angezeigt:
Da der Handler DateTime.ToShortTimeString aufruft, um die Zeit in die Aktivität TextView
zu drucken, wird die Uhrzeit weiterhin im Standardmäßigen 12-Stunden-AM/PM-Format gedruckt.
Zusammenfassung
In diesem Artikel wird erläutert, wie Sie ein TimePicker
Widget als modales Popupdialogfeld aus einer Android-Aktivität anzeigen. Es stellte eine Beispielimplementierung DialogFragment
bereit und diskutierte die IOnTimeSetListener
Schnittstelle. In diesem Beispiel wurde auch gezeigt, wie die DialogFragment
Interaktion mit der Hostaktivität zum Anzeigen der ausgewählten Uhrzeit möglich ist.