Adicionar seletores ao app

O Android oferece controles para que o usuário escolha uma hora ou data como caixas de diálogo prontas para uso. Esses seletores oferecem controles para escolher parte do horário (hora, minuto, AM/PM) ou data (mês, dia, ano).

.
Exemplo de seletor de horário do material.io
Figura 1. Seleção de horário em um seletor de agenda para dispositivos móveis.

O uso desses seletores ajuda a garantir que os usuários possam escolher um horário ou data válido, com o formato correto e ajustado para a localidade do usuário.

Exemplo de seletor de data modal do material.io
Figura 2. Seletor modal de data.

Recomendamos que você use DialogFragment para hospedar cada seletor de horário ou data. O DialogFragment gerencia ciclo de vida da caixa de diálogo e permite exibir seletores em diferentes layouts configurações, como em uma caixa de diálogo básica em celulares ou como parte incorporada de o layout em telas grandes.

Criar um seletor de horário

Para exibir um TimePickerDialog usando DialogFragment, defina uma classe de fragmento que estenda DialogFragment e retornam um TimePickerDialog do do fragmento. onCreateDialog() .

Estender o DialogFragment para um seletor de horário

Para definir um DialogFragment para um TimePickerDialog, faça o seguinte:

  • Defina o método onCreateDialog() para retornar uma instância do TimePickerDialog.
  • Implementar o TimePickerDialog.OnTimeSetListener para receber um callback quando o usuário definir o horário.

Veja um exemplo:

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

Consulte a classe TimePickerDialog para mais informações sobre a argumentos do construtor.

Agora você só precisa de um evento que adicione uma instância desse fragmento ao seu atividades.

Mostrar o seletor de horário

Depois de definir um DialogFragment como o do exemplo exemplo, você pode exibir o seletor de horário criando uma instância do DialogFragment e chamar o método show() .

Por exemplo, aqui está um botão que, ao ser tocado, chama um método para mostrar o caixa de diálogo:

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

Quando o usuário toca nesse botão, o sistema chama o seguinte método:

Kotlin

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

Java

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

Esse método chama show() em uma nova instância do DialogFragment definido no exemplo anterior. A O método show() requer uma instância de FragmentManager e um nome de tag exclusivo para o fragmento.

Criar um seletor de data

Criar um DatePickerDialog é como criar um TimePickerDialog. A diferença é que a caixa de diálogo que você cria para o fragmento.

Para mostrar uma DatePickerDialog usando DialogFragment, defina uma classe de fragmento que estenda DialogFragment e retorne uma DatePickerDialog do onCreateDialog() do fragmento. .

Estender o DialogFragment para um seletor de data

Para definir um DialogFragment para um DatePickerDialog, faça o seguinte:

  • Defina o método onCreateDialog() para retornar uma instância do DatePickerDialog.
  • Implementar o DatePickerDialog.OnDateSetListener para receber um retorno de chamada quando o usuário definir a data.

Veja um exemplo:

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

Consulte a DatePickerDialog para informações sobre os argumentos do construtor.

Você só precisa de um evento que adicione uma instância desse fragmento ao seu atividades.

Mostrar o seletor de data

Depois de definir um DialogFragment como o exemplo anterior, você pode exibir o seletor de datas criando uma instância do DialogFragment e chamando show().

Por exemplo, aqui está um botão que, ao ser tocado, chama um método para mostrar o caixa de diálogo:

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

Quando o usuário toca nesse botão, o sistema chama o seguinte método:

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

Esse método chama show() em uma nova instância do DialogFragment definido no exemplo anterior. A O método show() requer uma instância de FragmentManager e um nome de tag exclusivo para o fragmento.

Usar seletores com o preenchimento automático

Em 2017, o Android lançou Estrutura de preenchimento automático, que permite os usuários salvam dados que podem ser usados para preencher formulários em diferentes apps. Seletores pode ser útil em situações de preenchimento automático, fornecendo uma interface que permite aos usuários alterar o valor de um campo que armazena dados de data ou hora. Por exemplo, em um cartão de crédito formulário, um seletor de data permite que os usuários insiram ou alterem a data de expiração do cartão de crédito.

Como os seletores são caixas de diálogo, eles não são exibidos em uma atividade junto com outros campos. Para mostrar os dados do seletor quando ele não estiver visível, faça o seguinte: usar outra visualização, como uma EditText, que pode exibir o valor quando o seletor não estiver visível.

Um objeto EditText espera nativamente o preenchimento automático de dados do tipo AUTOFILL_TYPE_TEXT. Por outro lado, os serviços de preenchimento automático salvam os dados como AUTOFILL_TYPE_DATE para criar uma representação adequada dele. Para resolver a inconsistência em tipos, recomendamos que você crie uma visualização personalizada herdada do EditText e implementa os métodos necessários para processar corretamente. valores do tipo AUTOFILL_TYPE_DATE.

Siga estas etapas para criar uma subclasse de EditText que pode manipular valores do tipo AUTOFILL_TYPE_DATE:

  1. Crie uma classe herdada de EditText.
  2. Implementar o getAutofillType() que retorna AUTOFILL_TYPE_DATE.
  3. Implementar o getAutofillValue() , que retorna uma AutofillValue Objeto que representa a data em milissegundos. Para criar a devolução objeto, use o método forDate() para gerar um objeto AutofillValue.
  4. Implementar o autofill() . Esse método fornece a lógica para lidar com o O parâmetro AutofillValue, que é do tipo AUTOFILL_TYPE_DATE. Para manipular o parâmetro, crie um objeto representação de string dele, como mm/yyyy. Usar a string representação para definir a propriedade text da sua visualização.
  5. Implemente a funcionalidade que exibe um seletor quando o usuário quer editar a data na subclasse personalizada de EditText. A visualização é atualizada. a propriedade text com uma representação de string do valor que o usuário seleciona no seletor.

Para um exemplo de subclasse de EditText que processa AUTOFILL_TYPE_DATE, consulte o exemplo da Estrutura de preenchimento automático em Java ou Kotlin (em inglês).

Para saber mais sobre como provar a compatibilidade com o preenchimento automático para suas visualizações personalizadas, consulte Estrutura de preenchimento automático.