Aggiungi selettori alla tua app

Android fornisce all'utente controlli per scegliere un'ora o una data come e pronte all'uso. Questi selettori forniscono i controlli per selezionare ogni parte del tempo (ora, minuto, AM/PM) o data (mese, giorno, anno).

di Gemini Advanced.
Esempio di selettore dell'ora da material.io
Figura 1. Selezione dell'ora in un selettore di calendario mobile.

L'utilizzo di questi selettori aiuta a garantire che gli utenti possano scegliere un'ora o una data che sia valido, formattato correttamente e adattato alle impostazioni internazionali dell'utente.

Esempio di selettore della data modale da material.io
. Figura 2. Selettore della data modale.

Ti consigliamo di utilizzare DialogFragment per ospitare ogni selettore di data e ora. L'DialogFragment gestisce il ciclo di vita delle finestre di dialogo e ti consente di mostrare i selettori in un layout diverso configurazioni, ad esempio in una finestra di dialogo di base sui telefoni o come parte integrante di il layout su schermi grandi.

Crea un selettore di data e ora

Per visualizzare un TimePickerDialog usando DialogFragment, definisci una classe di frammenti che si estende DialogFragment e restituisci TimePickerDialog dal del frammento onCreateDialog() .

Estendi DialogFragment per un selettore dell'ora

Per definire un DialogFragment per un TimePickerDialog, segui questi passaggi:

  • Definisci il metodo onCreateDialog() per restituire un'istanza di TimePickerDialog.
  • Implementa il TimePickerDialog.OnTimeSetListener per ricevere un callback quando l'utente imposta l'ora.

Ecco un esempio:

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.
    }
}

Consulta il corso TimePickerDialog per informazioni sul gli argomenti del costruttore.

Ora hai solo bisogno di un evento che aggiunga un'istanza di questo frammento al tuo attività.

Mostra il selettore dell'ora

Dopo aver definito un valore DialogFragment come quello precedente Ad esempio, puoi visualizzare il selettore dell'ora creando un'istanza del DialogFragment e la chiamata al show() .

Ad esempio, ecco un pulsante che, quando viene toccato, chiama un metodo per mostrare Finestra di dialogo:

<Button
    android:id="@+id/pickTime"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Pick time" />

Quando l'utente tocca questo pulsante, il sistema chiama il seguente metodo:

Kotlin

findViewById<Button>(R.id.pickTime).setOnClickListener {
    TimePickerFragment().show(supportFragmentManager, "timePicker")
}

Java

findViewById<Button>(R.id.pickTime).setOnClickListener {
    TimePickerFragment().show(supportFragmentManager, "timePicker");
}

Questo metodo chiama show() su una nuova istanza del DialogFragment definito nell'esempio precedente. La Il metodo show() richiede un'istanza di FragmentManager e un nome tag univoco per il frammento.

Crea un selettore di date

La creazione di un DatePickerDialog è come creare un TimePickerDialog. La differenza è la finestra di dialogo che crei per il frammento.

Per visualizzare un DatePickerDialog utilizzando DialogFragment, definisci una classe di frammento che estende DialogFragment e restituisce un DatePickerDialog dal valore onCreateDialog() del frammento .

Estendi DialogFragment per un selettore di date

Per definire un DialogFragment per un DatePickerDialog, segui questi passaggi:

  • Definisci il metodo onCreateDialog() per restituire un'istanza di DatePickerDialog.
  • Implementa il DatePickerDialog.OnDateSetListener per ricevere un callback quando l'utente imposta la data.

Ecco un esempio:

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.
    }
}

Consulta le DatePickerDialog per informazioni sugli argomenti del costruttore.

Hai solo bisogno di un evento che aggiunga un'istanza di questo frammento al tuo attività.

Mostra il selettore della data

Dopo aver definito un valore DialogFragment come nell'esempio precedente, puoi visualizzare il selettore della data creando un'istanza del DialogFragment e chiamata a show().

Ad esempio, ecco un pulsante che, quando viene toccato, chiama un metodo per mostrare Finestra di dialogo:

<Button
    android:id="@+id/pickDate"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Pick date"/>

Quando l'utente tocca questo pulsante, il sistema chiama il seguente metodo:

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");
}

Questo metodo chiama show() su una nuova istanza del DialogFragment definito nell'esempio precedente. La Il metodo show() richiede un'istanza di FragmentManager e un nome tag univoco per il frammento.

Utilizzare i selettori con la compilazione automatica

Nel 2017, Android ha introdotto Framework di compilazione automatica, che consente Gli utenti salvano dati che possono essere utilizzati per compilare moduli in diverse app. Selettori può essere utile negli scenari di compilazione automatica mettendo a disposizione una UI che consente agli utenti di modificare di un campo in cui sono archiviati i dati relativi a data o ora. Ad esempio, in una carta di credito modulo, un selettore della data consente agli utenti di inserire o modificare la data di scadenza del proprio carta di credito.

Poiché i selettori sono finestre di dialogo, non vengono visualizzati in un'attività insieme in altri campi. Per visualizzare i dati del selettore quando il selettore non è visibile, puoi: utilizzare un'altra visualizzazione, ad esempio EditText, che può mostrare il valore quando il selettore non è visibile.

Un oggetto EditText prevede in modo nativo i dati di compilazione automatica di tipo AUTOFILL_TYPE_TEXT. Al contrario, i servizi di compilazione automatica salvano i dati AUTOFILL_TYPE_DATE per crearne una rappresentazione appropriata. Per risolvere le incoerenze tipi, ti consigliamo di creare una visualizzazione personalizzata che eredita EditText e implementa i metodi necessari per gestire correttamente di tipo AUTOFILL_TYPE_DATE.

Segui questi passaggi per creare una sottoclasse di EditText che può gestire valori di tipo AUTOFILL_TYPE_DATE:

  1. Crea una classe che eredita da EditText.
  2. Implementa il getAutofillType() che restituisce AUTOFILL_TYPE_DATE.
  3. Implementa il getAutofillValue() , che restituisce un AutofillValue che rappresenta la data in millisecondi. Per creare il reso utilizza l'oggetto forDate() per generare un oggetto AutofillValue.
  4. Implementa il autofill() . Questo metodo fornisce la logica per gestire Parametro AutofillValue, che è di tipo AUTOFILL_TYPE_DATE. Per gestire il parametro, crea un oggetto come mm/yyyy. Usa la stringa per impostare la proprietà text della vista.
  5. Implementare una funzionalità che mostri un selettore quando l'utente vuole apportare modifiche la data nella sottoclasse personalizzata EditText. La vista si aggiorna la proprietà text con una rappresentazione stringa del valore che l'utente seleziona nel selettore.

Per un esempio di una sottoclasse di EditText che gestisce AUTOFILL_TYPE_DATE valori, guarda l'esempio del framework di compilazione automatica in Java o Kotlin.

Per scoprire di più su come dimostrare il supporto della compilazione automatica per le visualizzazioni personalizzate, consulta Framework di compilazione automatica.