Android bietet Steuerelemente, mit denen Nutzer eine Uhrzeit oder ein Datum als gebrauchsfertige Dialogfelder auswählen können. Mit diesen Auswahlen können Sie die einzelnen Teile der Uhrzeit (Stunde, Minute, AM/PM) oder des Datums (Monat, Tag, Jahr) auswählen.
Mit diesen Auswahltools können Nutzer eine gültige Uhrzeit oder ein gültiges Datum auswählen, das richtig formatiert und an die Sprache des Nutzers angepasst ist.
Wir empfehlen, jede Zeit- oder Datumsauswahl in DialogFragment
zu hosten. Die DialogFragment
verwaltet den Dialog-Lebenszyklus für Sie und ermöglicht es Ihnen, Auswahlfelder in verschiedenen Layoutkonfigurationen anzuzeigen, z. B. in einem einfachen Dialogfeld auf Smartphones oder als eingebetteten Teil des Layouts auf großen Bildschirmen.
Zeitauswahl erstellen
Wenn du eine TimePickerDialog
mit DialogFragment
anzeigen möchtest, definiere eine Fragmentklasse, die DialogFragment
erweitert, und gib eine TimePickerDialog
über die onCreateDialog()
-Methode des Fragments zurück.
DialogFragment für eine Uhrzeitauswahl erweitern
So definieren Sie ein DialogFragment
für eine TimePickerDialog
:
- Definieren Sie die
onCreateDialog()
-Methode, um eine Instanz vonTimePickerDialog
zurückzugeben. - Implementiere die
TimePickerDialog.OnTimeSetListener
-Schnittstelle, um einen Callback zu erhalten, wenn der Nutzer die Uhrzeit einstellt.
Beispiel:
Kotlin
class TimePickerFragment : DialogFragment(), TimePickerDialog.OnTimeSetListener { override fun onCreateDialog(savedInstanceState: Bundle): Dialog { // Use the current time as the default values for the picker. val c = Calendar.getInstance() val hour = c.get(Calendar.HOUR_OF_DAY) val minute = c.get(Calendar.MINUTE) // Create a new instance of TimePickerDialog and return it. return TimePickerDialog(activity, this, hour, minute, DateFormat.is24HourFormat(activity)) } override fun onTimeSet(view: TimePicker, hourOfDay: Int, minute: Int) { // Do something with the time the user picks. } }
Java
public static class TimePickerFragment extends DialogFragment implements TimePickerDialog.OnTimeSetListener { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { // Use the current time as the default values for the picker. final Calendar c = Calendar.getInstance(); int hour = c.get(Calendar.HOUR_OF_DAY); int minute = c.get(Calendar.MINUTE); // Create a new instance of TimePickerDialog and return it. return new TimePickerDialog(getActivity(), this, hour, minute, DateFormat.is24HourFormat(getActivity())); } public void onTimeSet(TimePicker view, int hourOfDay, int minute) { // Do something with the time the user picks. } }
Informationen zu den Konstruktorargumenten finden Sie in der Klasse TimePickerDialog
.
Jetzt benötigen Sie nur noch ein Ereignis, mit dem Ihrer Aktivität eine Instanz dieses Fragments hinzugefügt wird.
Uhrzeitauswahl anzeigen
Nachdem Sie eine DialogFragment
wie im vorherigen Beispiel definiert haben, können Sie die Zeitauswahl anzeigen, indem Sie eine Instanz der DialogFragment
erstellen und die Methode show()
aufrufen.
Hier ist beispielsweise eine Schaltfläche, die beim Tippen eine Methode aufruft, um den Dialogfeld anzuzeigen:
<Button android:id="@+id/pickTime" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Pick time" />
Wenn der Nutzer auf diese Schaltfläche tippt, ruft das System die folgende Methode auf:
Kotlin
findViewById<Button>(R.id.pickTime).setOnClickListener { TimePickerFragment().show(supportFragmentManager, "timePicker") }
Java
findViewById<Button>(R.id.pickTime).setOnClickListener { TimePickerFragment().show(supportFragmentManager, "timePicker"); }
Bei dieser Methode wird show()
auf einer neuen Instanz der im vorherigen Beispiel definierten DialogFragment
aufgerufen. Für die Methode show()
ist eine Instanz von FragmentManager
und ein eindeutiger Tag-Name für das Fragment erforderlich.
Datumsauswahl erstellen
Das Erstellen einer DatePickerDialog
ähnelt dem Erstellen einer TimePickerDialog
. Der Unterschied besteht im Dialogfeld, das Sie für das Fragment erstellen.
Wenn du ein DatePickerDialog
mit DialogFragment
anzeigen möchtest, definiere eine Fragmentklasse, die DialogFragment
erweitert, und gib ein DatePickerDialog
über die onCreateDialog()
-Methode des Fragments zurück.
DialogFragment für eine Datumsauswahl erweitern
So definieren Sie einen DialogFragment
für einen DatePickerDialog
:
- Definieren Sie die Methode
onCreateDialog()
, um eine Instanz vonDatePickerDialog
zurückzugeben. - Implementiere die Schnittstelle
DatePickerDialog.OnDateSetListener
, um einen Callback zu erhalten, wenn der Nutzer das Datum festlegt.
Beispiel:
Kotlin
class DatePickerFragment : DialogFragment(), DatePickerDialog.OnDateSetListener { override fun onCreateDialog(savedInstanceState: Bundle): Dialog { // Use the current date as the default date in the picker. val c = Calendar.getInstance() val year = c.get(Calendar.YEAR) val month = c.get(Calendar.MONTH) val day = c.get(Calendar.DAY_OF_MONTH) // Create a new instance of DatePickerDialog and return it. return DatePickerDialog(requireContext(), this, year, month, day) } override fun onDateSet(view: DatePicker, year: Int, month: Int, day: Int) { // Do something with the date the user picks. } }
Java
public static class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { // Use the current date as the default date in the picker. final Calendar c = Calendar.getInstance(); int year = c.get(Calendar.YEAR); int month = c.get(Calendar.MONTH); int day = c.get(Calendar.DAY_OF_MONTH); // Create a new instance of DatePickerDialog and return it. return new DatePickerDialog(requireContext(), this, year, month, day); } public void onDateSet(DatePicker view, int year, int month, int day) { // Do something with the date the user picks. } }
Informationen zu den Konstruktorargumenten finden Sie in der Klasse DatePickerDialog
.
Sie benötigen lediglich ein Ereignis, mit dem Ihrer Aktivität eine Instanz dieses Fragments hinzugefügt wird.
Datumsauswahl anzeigen
Nachdem Sie eine DialogFragment
wie im vorherigen Beispiel definiert haben, können Sie die Datumsauswahl anzeigen, indem Sie eine Instanz der DialogFragment
erstellen und show()
aufrufen.
Hier ist beispielsweise eine Schaltfläche, die beim Tippen eine Methode aufruft, um den Dialogfeld anzuzeigen:
<Button android:id="@+id/pickDate" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Pick date"/>
Wenn der Nutzer auf diese Schaltfläche tippt, ruft das System die folgende Methode auf:
Kotlin
findViewById<Button>(R.id.pickDate).setOnClickListener { val newFragment = DatePickerFragment() newFragment.show(supportFragmentManager, "datePicker") }
Java
findViewById<Button>(R.id.pickDate).setOnClickListener { val newFragment = DatePickerFragment(); newFragment.show(supportFragmentManager, "datePicker"); }
Bei dieser Methode wird show()
auf einer neuen Instanz der im vorherigen Beispiel definierten DialogFragment
aufgerufen. Für die Methode show()
ist eine Instanz von FragmentManager
und ein eindeutiger Tag-Name für das Fragment erforderlich.
Auswahltools mit Autofill verwenden
2017 führte Android das Autofill-Framework ein, mit dem Nutzer Daten speichern können, die zum Ausfüllen von Formularen in verschiedenen Apps verwendet werden können. Auswahlfelder können in Autofill-Szenarien nützlich sein, da sie eine Benutzeroberfläche bieten, über die Nutzer den Wert eines Felds ändern können, in dem Datums- oder Uhrzeitdaten gespeichert sind. In einem Kreditkartenformular können Nutzer beispielsweise mit einer Datumsauswahl das Ablaufdatum ihrer Kreditkarte eingeben oder ändern.
Da Auswahlfelder Dialogfelder sind, werden sie in einer Aktivität nicht zusammen mit anderen Feldern angezeigt. Wenn die Daten der Auswahl auch dann angezeigt werden sollen, wenn die Auswahl nicht sichtbar ist, können Sie eine andere Ansicht verwenden, z. B. eine EditText
, die den Wert anzeigen kann, wenn die Auswahl nicht sichtbar ist.
Für ein EditText
-Objekt werden standardmäßig Autofill-Daten vom Typ AUTOFILL_TYPE_TEXT
erwartet.
Autofill-Dienste speichern die Daten dagegen als AUTOFILL_TYPE_DATE
, um eine angemessene Darstellung zu erstellen. Zur Behebung von Inkonsistenzen bei Typen empfehlen wir, eine benutzerdefinierte Ansicht zu erstellen, die die Attribute EditText
übernimmt und die Methoden implementiert, die zur korrekten Verarbeitung von Werten des Typs AUTOFILL_TYPE_DATE
erforderlich sind.
So erstellen Sie eine Unterklasse von EditText
, die Werte vom Typ AUTOFILL_TYPE_DATE
verarbeiten kann:
- Erstellen Sie eine Klasse, die von
EditText
abgeleitet ist. - Implementieren Sie die Methode
getAutofillType()
, dieAUTOFILL_TYPE_DATE
zurückgibt. - Implementieren Sie die Methode
getAutofillValue()
, die einAutofillValue
-Objekt zurückgibt, das das Datum in Millisekunden darstellt. Verwenden Sie zum Erstellen des Rückgabeobjekts die MethodeforDate()
, um einAutofillValue
-Objekt zu generieren. - Implementieren Sie die Methode
autofill()
. Diese Methode enthält die Logik zum Umgang mit dem ParameterAutofillValue
vom TypAUTOFILL_TYPE_DATE
. Erstellen Sie zum Verarbeiten des Parameters eine korrekte Stringdarstellung, z. B.mm/yyyy
. Verwenden Sie die Stringdarstellung, um dietext
-Eigenschaft Ihrer Ansicht festzulegen. - Implementieren Sie eine Funktion, die eine Auswahl anbietet, wenn der Nutzer das Datum in der benutzerdefinierten Unterklasse von
EditText
bearbeiten möchte. In der Ansicht wird die Propertytext
mit einer Stringdarstellung des Werts aktualisiert, den der Nutzer in der Auswahl auswählt.
Ein Beispiel einer abgeleiteten Klasse von EditText
, die AUTOFILL_TYPE_DATE
-Werte verarbeitet, finden Sie im Autofill Framework-Beispiel in Java oder Kotlin.
Weitere Informationen zum Bereitstellen von Autofill-Unterstützung für benutzerdefinierte Ansichten finden Sie im Autofill-Framework.