🚀 3.4 DatePicker

O DatePicker é o componente oficial para seleção de datas. Para uma experiência moderna e estável, o Android recomenda o uso do DatePickerDialog dentro de um DialogFragment. Esta abordagem gerencia automaticamente o ciclo de vida do diálogo, evitando falhas se o usuário rotacionar a tela, por exemplo.

Implementando o DatePicker Moderno (Java 17)

Em conformidade com as melhores práticas de engenharia, abandonamos a API legada Calendar em favor da robusta java.time (JSR-310), disponível nativamente a partir do Android 8.0 (API 26).

1. Criando o DialogFragment

Primeiro, criamos uma classe auxiliar para gerenciar o diálogo:

public class DatePickerFragment extends DialogFragment {
 
    private final OnDateSetListener listener;
 
    public DatePickerFragment(OnDateSetListener listener) {
        this.listener = listener;
    }
 
    @NonNull
    @Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
        // Utilizamos LocalDate do Java 17 para obter a data atual
        var hoje = LocalDate.now();
        return new DatePickerDialog(requireContext(), listener, 
                hoje.getYear(), hoje.getMonthValue() - 1, hoje.getDayOfMonth());
    }
}

2. Integrando na GastoActivity (ViewBinding)

Na GastoActivity, utilizamos o ViewBinding para capturar o clique no botão e exibir o seletor:

public class GastoActivity extends AppCompatActivity {
 
    private ActivityGastoBinding binding;
    private LocalDate dataSelecionada = LocalDate.now();
 
    @Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = ActivityGastoBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());
 
        // Inicializa o texto do botão com a data atual formatada
        atualizarDataBotao();
 
        binding.btnData.setOnClickListener(v -> {
            var fragment = new DatePickerFragment((view, year, month, dayOfMonth) -> {
                dataSelecionada = LocalDate.of(year, month + 1, dayOfMonth);
                atualizarDataBotao();
            });
            fragment.show(getSupportFragmentManager(), "datePicker");
        });
    }
 
    private void atualizarDataBotao() {
        var formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
        binding.btnData.setText(dataSelecionada.format(formatter));
    }
}

IMPORTANT

Por que DialogFragment? Ao contrário do antigo showDialog(id), o DialogFragment é um componente que possui seu próprio ciclo de vida. Isso garante que, se o dispositivo for rotacionado enquanto o calendário estiver aberto, o Android recriará o diálogo corretamente, mantendo a integridade da aplicação.

TIP

O uso de LocalDate e DateTimeFormatter (Java 17) torna a manipulação de datas muito mais segura contra erros comuns, como o índice do mês (que no antigo Calendar iniciava em 0, causando confusão frequente).


⬅️ Capítulo Anterior | Próximo Capítulo ➡️