type studio implementar ejemplo edittext android date time android-ui

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