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