Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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 TimePickerDialogumschlossenen , 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 TimePickerDialogUhrzeit auswählen und auf die Schaltfläche "OK " klicken, wird die TimePickerDialog Methode "IOnTimeSetListener.OnTimeSetSet" aufgerufen.
Diese Schnittstelle wird vom Hosting DialogFragment implementiert (TimePickerFragmentsiehe 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
DialogFragmentkann ein Ereignis definieren, das beimOnTimeSetAufrufen ausgelöst wird.Die Verwendung einer
Action– DieDialogFragmentkann eineAction<DateTime>aufrufen, um die Uhrzeit in der Aktivität anzuzeigen. Die Aktivität stellt beimAction<DateTimeInstanziieren 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 TimePickerOption anzuzeigen.
Der nächste Schritt besteht darin, dies DialogFragmentzu 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.IOnTimeSetListenerwird. 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.
TimePickerFragmentist eine Unterklasse vonDialogFragment. Außerdem wird dieTimePickerDialog.IOnTimeSetListenerSchnittstelle implementiert (d. d. r. die erforderlicheOnTimeSetMethode):public class TimePickerFragment : DialogFragment, TimePickerDialog.IOnTimeSetListenerTAGwird für Protokollierungszwecke initialisiert (MyTimePickerFragment kann in eine beliebige Zeichenfolge geändert werden). DietimeSelectedHandlerAktion wird an einen leeren Delegaten initialisiert, um Nullverweis-Ausnahmen zu verhindern:public static readonly string TAG = "MyTimePickerFragment"; Action<DateTime> timeSelectedHandler = delegate { };Die
NewInstanceFactorymethode wird aufgerufen, um eine neueTimePickerFragmentInstanziierung durchzuführen. Diese Methode verwendet einenAction<DateTime>Handler, der aufgerufen wird, wenn der Benutzer auf die Schaltfläche "OK" in der :TimePickerDialogpublic static TimePickerFragment NewInstance(Action<DateTime> onTimeSelected) { TimePickerFragment frag = new TimePickerFragment(); frag.timeSelectedHandler = onTimeSelected; return frag; }Wenn das Fragment angezeigt werden soll, ruft Android die
DialogFragmentMethode OnCreateDialog auf. Diese Methode erstellt ein neuesTimePickerDialogObjekt 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
TimePickerDialogfeld ändert, wird dieOnTimeSetMethode aufgerufen.OnTimeSeterstellt einDateTimeObjekt 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
DateTimeObjekt wird an das Objekt übergeben, dastimeSelectedHandlerzur Erstellungszeit für dasTimePickerFragmentObjekt registriert ist.OnTimeSetruft 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 TimePickerFragmentwird 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 TextViewzu 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.




