SetMinDate (...) для DatePicker не работает, когда вызывается второй раз

Я в конкретной ситуации, в которой мне нужно изменить минимальную и максимальную дату DatePicker в соответствии с выбранным элементом Spinner. Здесь кусок кода, который я использую, чтобы переключать минуты и максимальную дату.

private void switchCalculationMethod(int method) {
    calculationMethod = method;
    switch (method) {
        case METHOD_1:
            datePicker.setMinDate(new LocalDate().minusWeeks(42).getMillis());
            datePicker.setMaxDate(new LocalDate().plusDays(1).getMillis() - 1);
            break;
        case METHOD_2:
            datePicker.setMinDate(new LocalDate().minusWeeks(2).getMillis()); // This don't work!!
            datePicker.setMaxDate(new LocalDate().plusWeeks(40).getMillis()); // This works!!!
            break;
    }
    datePicker.init(today.getYear(), today.getMonthOfYear() - 1,
            today.getDayOfMonth(), this);
}

Таким образом, DatePicker будет правильно настроен в первый раз, проблема возникает, когда я пытаюсь изменить дату min снова (изменение максимальной даты работает). Он остался бы на том значении, которое я поставил первым. Я думаю, что это ошибка. Я здесь что-то не так? Есть ли обходной путь для этого?

PS: Я использую время Джоды.

Ответ 1

Это происходит потому, что метод setMinDate() имеет проверку

 if (mTempDate.get(Calendar.YEAR) == mMinDate.get(Calendar.YEAR)
                && mTempDate.get(Calendar.DAY_OF_YEAR) != mMinDate.get(Calendar.DAY_OF_YEAR){
            return;
 }

Простым обходным путем является установка минимальной даты с другим годом сначала, например

mPicker.setMinDate(0);

mPicker.setMinDate(new LocalDate().minusWeeks(2)
                                .toDateTimeAtStartOfDay().getMillis());

Это работает для меня.

Ответ 2

Как уже было сказано выше, вы можете обойти проверку, вызвав их до фактического изменения значения:

setMinDate(0);
setMaxDate(Long.MAX_VALUE);

Если вы хотите reset установить минимальное или максимальное значение по умолчанию, вы можете использовать следующие значения:

setMinDate(-2208902400000L);  // Jan 1, 1900
setMaxDate(4102531200000L);  // Jan 1, 2100

Ответ 3

сначала обновить setMinDate до 0 после этого setMinDate в соответствии с вами dateobject

mPicker.setMinDate(0);

mPicker.setMinDate(datepickerObject.getTimeInMillis());

Ответ 4

Это не хорошее решение этой проблемы, но оно работает для меня. Я просто создаю новый DatePicker каждый раз, когда нажимают TextView и устанавливают необходимые даты (min, max). Возможно, это не дружелюбная к памяти, но я не нашел другого решения.

public class CustomDatePicker extends TextView {

private long mMinDate;
private long mMaxDate;

public CustomDatePicker(Context context) {
    this(context, null, 0);
}

public CustomDatePicker(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
}

public CustomDatePicker(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, 0);

    final Calendar calendar = Calendar.getInstance();
    final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.US);

    final DatePickerDialog.OnDateSetListener onDateSetListener = new DatePickerDialog.OnDateSetListener() {
        @Override
        public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
            calendar.set(Calendar.YEAR, year);
            calendar.set(Calendar.MONTH, month);
            calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
            setText(dateFormat.format(calendar.getTime()));
        }
    };

    mMinDate = -1;
    mMaxDate = -1;

    setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {

            DatePickerDialog datePickerDialog = new DatePickerDialog(
                    getContext(),
                    R.style.DatePickerStyle,
                    onDateSetListener,
                    calendar.get(Calendar.YEAR),
                    calendar.get(Calendar.MONTH),
                    calendar.get(Calendar.DAY_OF_MONTH)
            );

            if (mMinDate != -1) datePickerDialog.getDatePicker().setMinDate(mMinDate);
            if (mMaxDate != -1) datePickerDialog.getDatePicker().setMaxDate(mMaxDate);
            datePickerDialog.show();
        }
    });
}

public void setMinDate(long minDate) {
    mMinDate = minDate;
}

public void setMaxDate(long maxDate) {
    mMaxDate = maxDate;
}

}