Einer App Auswahlelemente hinzufügen

Compose ausprobieren
Jetpack Compose ist das empfohlene UI-Toolkit für Android. Weitere Informationen zum Hinzufügen von Komponenten in Compose

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.

Beispiel für eine Uhrzeitauswahl von material.io
Abbildung 1. Auswahl der Stunde in einer mobilen Kalenderauswahl

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.

Beispiel für eine modale Datumsauswahl von material.io
Abbildung 2. Modale Datumsauswahl.

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 von TimePickerDialog 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 von DatePickerDialog 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:

  1. Erstellen Sie eine Klasse, die von EditText abgeleitet ist.
  2. Implementieren Sie die Methode getAutofillType(), die AUTOFILL_TYPE_DATE zurückgibt.
  3. Implementieren Sie die Methode getAutofillValue(), die ein AutofillValue-Objekt zurückgibt, das das Datum in Millisekunden darstellt. Verwenden Sie zum Erstellen des Rückgabeobjekts die Methode forDate(), um ein AutofillValue-Objekt zu generieren.
  4. Implementieren Sie die Methode autofill(). Diese Methode enthält die Logik zum Umgang mit dem Parameter AutofillValue vom Typ AUTOFILL_TYPE_DATE. Erstellen Sie zum Verarbeiten des Parameters eine korrekte Stringdarstellung, z. B. mm/yyyy. Verwenden Sie die Stringdarstellung, um die text-Eigenschaft Ihrer Ansicht festzulegen.
  5. 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 Property text 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.