🚀 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), oDialogFragmenté 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
LocalDateeDateTimeFormatter(Java 17) torna a manipulação de datas muito mais segura contra erros comuns, como o índice do mês (que no antigoCalendariniciava em 0, causando confusão frequente).