android - studio - setMinDate(...) para DatePicker no funciona cuando se invoca por segunda vez
implementar time picker y date picker-android (4)
Esto sucede porque el método setMinDate () tiene control
if (mTempDate.get(Calendar.YEAR) == mMinDate.get(Calendar.YEAR)
&& mTempDate.get(Calendar.DAY_OF_YEAR) != mMinDate.get(Calendar.DAY_OF_YEAR){
return;
}
Una solución simple es establecer una fecha mínima con un año diferente al principio, por ejemplo
mPicker.setMinDate(0);
mPicker.setMinDate(new LocalDate().minusWeeks(2)
.toDateTimeAtStartOfDay().getMillis());
Esto funciona para mi.
Estoy en una situación particular en la que tengo que modificar la fecha mínima y máxima de DatePicker
según el elemento seleccionado de un Spinner
. Aquí está el trozo de código que estoy usando para cambiar la fecha mínima y máxima.
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);
}
Por lo tanto, el DatePicker
se configuraría correctamente la primera vez, se produce un problema cuando intento cambiar la fecha min nuevamente (el cambio de la fecha máxima funciona). Permanecería en el valor que había establecido primero. Estoy pensando que esto es un error. ¿Estoy haciendo algo mal aquí? ¿Hay una solución para esto?.
PD: estoy usando la aplicación de tiempo Joda.
primera actualización setMinDate a 0 después de setMinDate de acuerdo con su fecha
mPicker.setMinDate (0);
mPicker.setMinDate (datepickerObject.getTimeInMillis ());
Esta no es una buena solución a este problema, pero funciona para mí. Simplemente estoy creando un nuevo DatePicker cada vez que se hace clic en TextView y se establecen las fechas necesarias (mínimo, máximo). Puede que no sea compatible con la memoria, pero no he encontrado ninguna otra solución.
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;
}
}
Como se dijo anteriormente, puede omitir el cheque llamando a aquellos antes de cambiar realmente el valor:
setMinDate(0);
setMaxDate(Long.MAX_VALUE);
Si desea restablecer el valor mínimo o máximo a su valor predeterminado, puede usar los siguientes valores:
setMinDate(-2208902400000L); // Jan 1, 1900
setMaxDate(4102531200000L); // Jan 1, 2100