DatePicker.OnDateChangedListener called twice
Instead of the onDateSet callback I've overridden onClick method of the DatePickerDialog dialog and handle BUTTON_POSITIVE clicks only.
public static class DatePickerFragment extends DialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final Calendar c = Calendar.getInstance();
int initialYear = c.get(Calendar.YEAR);
int initialMonth = c.get(Calendar.MONTH);
int initialDay = c.get(Calendar.DAY_OF_MONTH);
return new DatePickerDialog(getActivity(), null, initialYear, initialMonth, initialDay) {
@Override
public void onClick(DialogInterface dialog, int which) {
if (which == BUTTON_POSITIVE) {
int year = getDatePicker().getYear();
int month = getDatePicker().getMonth();
int day = getDatePicker().getDayOfMonth();
//TODO: Do your logic here
}
super.onClick(dialog, which);
}
};
}
}
The code stays clear but still it's not clear why onDateSet is called twice.
When I test my application, method onDateSet called twice after accept the date selection and once when I canceled.
I added a validation in the method onDateSet with parameter view, something like this
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth){
if (view.isShown()) {
updateDate(year, monthOfYear, dayOfMonth);
}
}
I hope you serve
I still haven't managed to find a neat fix. I've rather found a workaround, so the event does not fire twice. The workaround is as follows:
int timesCalled = 1;
private DatePicker.OnDateChangedListener dateSetListener = new DatePicker.OnDateChangedListener() {
public void onDateChanged(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
Calendar c = Calendar.getInstance();
c.set(year, monthOfYear, dayOfMonth);
timesCalled += 1;
if ((timesCalled % 2) == 0) {
System.out.println ("TEST");
}
}};