Freigeben über


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.

Beispielfoto des Dialogfelds

Ü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:

Anfänglicher Beispiel-App-Bildschirm

Wenn Sie auf die Schaltfläche "ZEIT AUSWÄHLEN" klicken, wird TimePickerDialog die Beispiel-App gestartet, wie in diesem Screenshot dargestellt:

Screenshot des standardmäßigen Dialogfelds

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:

  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 OnTimeSet Aufrufen ausgelöst wird.

  3. Die Verwendung einer Action – Die DialogFragment kann eine Action<DateTime> aufrufen, um die Uhrzeit in der Aktivität anzuzeigen. Die Aktivität stellt beim Action<DateTime Instanziieren der DialogFragment.

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:

Anfänglicher App-Bildschirm

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.

  • TimePickerFragment ist eine Unterklasse von DialogFragment. Außerdem wird die TimePickerDialog.IOnTimeSetListener Schnittstelle implementiert (d. d. r. die erforderliche OnTimeSet Methode):

    public class TimePickerFragment : DialogFragment, TimePickerDialog.IOnTimeSetListener
    
  • TAG wird für Protokollierungszwecke initialisiert (MyTimePickerFragment kann in eine beliebige Zeichenfolge geändert werden). Die timeSelectedHandler 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 neue TimePickerFragmentInstanziierung durchzuführen. Diese Methode verwendet einen Action<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 neues TimePickerDialog Objekt und initialisiert es mit der Aktivität, dem Rückrufobjekt (die aktuelle Instanz der TimePickerFragment) 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 die OnTimeSet Methode aufgerufen. OnTimeSet erstellt ein DateTime 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, das timeSelectedHandler zur Erstellungszeit für das TimePickerFragment 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 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):

Das Zeitdialogfeld wird im AM/PM-Modus angezeigt.

Wenn Sie im TimePicker Dialogfeld auf "OK" klicken, aktualisiert der Handler die Aktivität TextView mit der ausgewählten Uhrzeit und beendet dann:

A/M-Zeit wird in der AktivitätstextView angezeigt

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:

Dialogfeld

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.