usar style ejemplo edittext custom como android datepicker datepickerdialog

android - style - DatePicker.setMinDate(long minDate) lanza IllegalArgumentException: el tiempo no está entre



edit datepicker android (7)

El problema fue que las horas, minutos, segundos y milisegundos de los calendarios que estaba usando para configurar minDate y maxDate del DatePicker maxDate a los valores correspondientes a la hora en que se llamó a Calendar.getInstance() . Y cuando pasé el día, el mes y el año al constructor de DatePickerDialog , las fechas eran las mismas, pero los milisegundos diferían. Por lo tanto, podría suceder que los milisegundos establecidos en maxDate fueran más pequeños que los milisegundos establecidos en la hora actual del DatePicker , por lo tanto, la fecha en que se suponía que se mostraría el DatePicker se evaluó como mayor que maxDate con algunos milisegundos más) ... Y de manera similar para minDate .

Espero que sea comprensible.

Entonces, lo que ayudó fue establecer los calendarios en el último milisegundo del día cuando se usaron para establecer maxDate y en el primer milisegundo del día cuando se usaron para establecer minDate . Al igual que:

(Solo un fragmento de código de la cláusula else ).

dpd.setTitle(getString(R.string.end_of_interval)); cal.add(Calendar.MONTH, 6); cal.set(Calendar.HOUR_OF_DAY, cal.getMaximum(Calendar.HOUR_OF_DAY)); cal.set(Calendar.MINUTE, cal.getMaximum(Calendar.MINUTE)); cal.set(Calendar.SECOND, cal.getMaximum(Calendar.SECOND)); cal.set(Calendar.MILLISECOND, cal.getMaximum(Calendar.MILLISECOND)); dpd.getDatePicker().setMaxDate(cal.getTimeInMillis()); cal.set(someTimeDuringYear1, someTimeDuringMonth1 - 1, someTimeDuringDay1); cal.set(Calendar.HOUR_OF_DAY, cal.getMinimum(Calendar.HOUR_OF_DAY)); cal.set(Calendar.MINUTE, cal.getMinimum(Calendar.MINUTE)); cal.set(Calendar.SECOND, cal.getMinimum(Calendar.SECOND)); cal.set(Calendar.MILLISECOND, cal.getMinimum(Calendar.MILLISECOND)); dpd.getDatePicker().setMinDate(cal.getTimeInMillis());

Espero que sea de ayuda para alguien.

Además, si a alguien se le ocurre una solución más elegante, hágamelo saber.

Tengo un intervalo de tiempo que consiste en un comienzo y una fecha de finalización. Tengo una manera de permitir que el usuario establezca estas fechas a través de DatePickerDialogs. Aquí está el código del método que crea y muestra los diálogos:

private void editInterval(boolean beginning) { DatePickerDialog dpd; Calendar cal = Calendar.getInstance(); if (beginning) { dpd = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() { @Override public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { someTimeDuringYear1 = year; someTimeDuringMonth1 = monthOfYear + 1; someTimeDuringDay1 = dayOfMonth; Calendar cal1 = Calendar.getInstance(); cal1.set(Calendar.YEAR, year); cal1.set(Calendar.MONTH, monthOfYear); cal1.set(Calendar.DAY_OF_MONTH, dayOfMonth); Calendar cal2 = Calendar.getInstance(); cal2.set(Calendar.YEAR, someTimeDuringYear2); cal2.set(Calendar.MONTH, someTimeDuringMonth2); cal2.set(Calendar.DAY_OF_MONTH, someTimeDuringDay2); if (cal1.getTimeInMillis() > cal2.getTimeInMillis()) { someTimeDuringYear2 = someTimeDuringYear1; someTimeDuringMonth2 = someTimeDuringMonth1; someTimeDuringDay2 = someTimeDuringDay1; } updateSomeTimeDuring(); editDepartureInterval(); } }, someTimeDuringYear1, someTimeDuringMonth1 - 1, someTimeDuringDay1); dpd.setTitle(getString(R.string.beginning_of_interval)); cal.add(Calendar.MONTH, 6); dpd.getDatePicker().setMaxDate(cal.getTimeInMillis()); cal.add(Calendar.MONTH, -6); cal.add(Calendar.DATE, 2); dpd.getDatePicker().setMinDate(cal.getTimeInMillis()); } else { dpd = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() { @Override public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { someTimeDuringYear2 = year; someTimeDuringMonth2 = monthOfYear + 1; someTimeDuringDay2 = dayOfMonth; updateSomeTimeDuring(); editDepartureInterval(); } }, someTimeDuringYear2, someTimeDuringMonth2 - 1, someTimeDuringDay2); dpd.setTitle(getString(R.string.end_of_interval)); cal.add(Calendar.MONTH, 6); dpd.getDatePicker().setMaxDate(cal.getTimeInMillis()); cal.set(someTimeDuringYear1, someTimeDuringMonth1 - 1, someTimeDuringDay1); dpd.getDatePicker().setMinDate(cal.getTimeInMillis()); } dpd.show(); dpd.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT)); }

El valor de la variable beginning determina si el usuario ha elegido editar la fecha inicial o final del intervalo. Esas someTimeDuringYear1 y similares son variables miembro relacionadas con la fecha de inicio, someTimeDuringYear2 y similares están relacionadas con la fecha final del intervalo. Todos ellos están preestablecidos antes de que este diálogo se cree y se muestre.

La excepción se produce al editar el intervalo inicial y final. Digamos que elijo editar la fecha de finalización del intervalo. Todo funciona a la perfección hasta que establezco la fecha a la última fecha en que se me permite. Si hago eso y confirmo, todo sigue pareciendo estar bien, pero cuando trato de editar nuevamente la fecha de finalización del intervalo, la aplicación falla y se lanza la excepción. (Lo mismo sucede si configuro la fecha de inicio del intervalo a la última fecha permitida y luego trato de editarlo nuevamente).

Aquí está el registro de LogCat:

03-28 17:18:16.901: E/AndroidRuntime(6112): FATAL EXCEPTION: main 03-28 17:18:16.901: E/AndroidRuntime(6112): java.lang.IllegalArgumentException: Time not between Sat Mar 30 17:18:16 CET 2013 and Sat Sep 28 17:18:16 CEST 2013 03-28 17:18:16.901: E/AndroidRuntime(6112): at android.widget.CalendarView.goTo(CalendarView.java:805) 03-28 17:18:16.901: E/AndroidRuntime(6112): at android.widget.CalendarView.setMinDate(CalendarView.java:487) 03-28 17:18:16.901: E/AndroidRuntime(6112): at android.widget.DatePicker.setMinDate(DatePicker.java:315) 03-28 17:18:16.901: E/AndroidRuntime(6112): at com.skypicker.android.MainActivity.editInterval(MainActivity.java:344) 03-28 17:18:16.901: E/AndroidRuntime(6112): at com.skypicker.android.MainActivity.access$10(MainActivity.java:296) 03-28 17:18:16.901: E/AndroidRuntime(6112): at com.skypicker.android.MainActivity$5.onClick(MainActivity.java:261) 03-28 17:18:16.901: E/AndroidRuntime(6112): at com.android.internal.app.AlertController$AlertParams$3.onItemClick(AlertController.java:924) 03-28 17:18:16.901: E/AndroidRuntime(6112): at android.widget.AdapterView.performItemClick(AdapterView.java:292) 03-28 17:18:16.901: E/AndroidRuntime(6112): at android.widget.AbsListView.performItemClick(AbsListView.java:1063) 03-28 17:18:16.901: E/AndroidRuntime(6112): at android.widget.AbsListView$PerformClick.run(AbsListView.java:2519) 03-28 17:18:16.901: E/AndroidRuntime(6112): at android.widget.AbsListView$1.run(AbsListView.java:3173) 03-28 17:18:16.901: E/AndroidRuntime(6112): at android.os.Handler.handleCallback(Handler.java:605) 03-28 17:18:16.901: E/AndroidRuntime(6112): at android.os.Handler.dispatchMessage(Handler.java:92) 03-28 17:18:16.901: E/AndroidRuntime(6112): at android.os.Looper.loop(Looper.java:137) 03-28 17:18:16.901: E/AndroidRuntime(6112): at android.app.ActivityThread.main(ActivityThread.java:4424) 03-28 17:18:16.901: E/AndroidRuntime(6112): at java.lang.reflect.Method.invokeNative(Native Method) 03-28 17:18:16.901: E/AndroidRuntime(6112): at java.lang.reflect.Method.invoke(Method.java:511) 03-28 17:18:16.901: E/AndroidRuntime(6112): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:787) 03-28 17:18:16.901: E/AndroidRuntime(6112): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:554) 03-28 17:18:16.901: E/AndroidRuntime(6112): at dalvik.system.NativeStart.main(Native Method)

He estado buscando respuestas y tratando de encontrar una solución toda la tarde. Cualquier ayuda es apreciada.

Gracias.

PD: Esta es la primera pregunta que hago aquí, así que me disculpo si hay algo malo en ello. Estaré encantado de proporcionar cualquier información faltante sobre lo que está sucediendo.

EDITAR: Por extraño que parezca, aunque el problema surge en la línea cuando intento establecer la fecha minDate , en realidad parece ser que la fecha es "más grande" que la fecha maxDate . La razón que tengo para creer esto es que si paso someTimeDuringDay2 - 1 lugar de someTimeDuringDay2 al someTimeDuringDay2 del DatePickerDialog , el problema desaparece. Pero entonces el campo "día" en el DatePicker es en realidad uno más pequeño de lo que quiero que sea. Necesito que se establezca en someTimeDuringDay2 cuando se someTimeDuringDay2 el DatePickerDialog , no en someTimeDuringDay2 - 1 . Pero parece tener un problema cuando la fecha es la misma que su fecha maxDate .


Estaba recibiendo el mismo error, lo soluciono configurando

dialog.getDatePicker().setCalendarViewShown(false);

en la aplicación no se requería ningún calendario, esto es lo que hice

Calendar tempDate =Calendar.getInstance(); dialog.getDatePicker().setMaxDate(Calendar.getInstance().getTimeInMillis(); dialog.getDatePicker().setCalendarViewShown(false); tempDate.add(Calendar.YEAR, -120); dialog.getDatePicker().setMinDate(tempDate.getTimeInMillis());


Esto es lo que hice por el mismo error que estaba recibiendo en DatePicker. Entonces, cuando estuve configurando MaxDate y MinDate en DatePicker, los milisegundos estaban cambiando. Para mi aplicación, no importaba si la fecha era de un segundo. Necesitaba la diferencia entre min y maxdates como dos días.

final Calendar c = Calendar.getInstance(); c.setTimeZone(TimeZone.getDefault()); int year = c.get(Calendar.YEAR); int month = c.get(Calendar.MONTH); int day = c.get(Calendar.DAY_OF_MONTH); DatePickerDialog datePickerDialog = new DatePickerDialog(getActivity(), this, year, month, day); long OFFSET = 1000 ; //milli seconds offset for your date. datePickerDialog.getDatePicker().setMaxDate(c.getTimeInMillis() + 1 * OFFSET); c.add(Calendar.DAY_OF_MONTH, -1); datePickerDialog.getDatePicker().setMinDate(c.getTimeInMillis() - 1 * OFFSET);

Espero que esto ayude a alguien. Esto mantendrá la fecha establecida entre los límites. Es posible que tenga que cambiar el desplazamiento en función de su aplicación.


Obtuve la misma excepción cuando hoy no está en [minDate, maxDate]. Pero si cambié mi código para llamar a setMinDate() antes de setMaxDate() , funcionó.


Para mejorar la respuesta anterior, decidí publicar esto.

Cuando llame a setMaxDate () varias veces, digamos un cambio dinámico en onPrepareDialog (), debe asegurarse de que el nuevo año máximo no sea igual al año máximo anterior o que el nuevo día máximo sea igual al anterior día máximo.

Suena extraño pero este es el código fuente de código grep

public void setMaxDate(long maxDate) { mTempDate.setTimeInMillis(maxDate); if (mTempDate.get(Calendar.YEAR) == mMaxDate.get(Calendar.YEAR) && mTempDate.get(Calendar.DAY_OF_YEAR) != mMaxDate.get(Calendar.DAY_OF_YEAR)) { return; } mMaxDate.setTimeInMillis(maxDate); mCalendarView.setMaxDate(maxDate); if (mCurrentDate.after(mMaxDate)) { mCurrentDate.setTimeInMillis(mMaxDate.getTimeInMillis()); updateCalendarView(); } updateSpinners(); }

Así que para mí, llamé a setMaxDate () dos veces. Una vez con un valor ficticio donde los años se compensan con +100 y una segunda vez para los campos reales que deseo.

Aquí está el resultado combinado:

maxDate.set(Calendar.HOUR_OF_DAY, maxDate.getMaximum(Calendar.HOUR_OF_DAY)); maxDate.set(Calendar.MINUTE, maxDate.getMaximum(Calendar.MINUTE)); maxDate.set(Calendar.SECOND, maxDate.getMaximum(Calendar.SECOND)); maxDate.set(Calendar.MILLISECOND, maxDate.getMaximum(Calendar.MILLISECOND)); maxDateDummy.set(Calendar.HOUR_OF_DAY, maxDate.getMaximum(Calendar.HOUR_OF_DAY)); maxDateDummy.set(Calendar.MINUTE, maxDate.getMaximum(Calendar.MINUTE)); maxDateDummy.set(Calendar.SECOND, maxDate.getMaximum(Calendar.SECOND)); maxDateDummy.set(Calendar.MILLISECOND, maxDate.getMaximum(Calendar.MILLISECOND)); //update the dummy date by 100 years to force android OS to change max time. maxDateDummy.set(Calendar.YEAR, maxDateDummy.get(Calendar.YEAR) + 100); datePicker.setMaxDate(maxDateDummy.getTimeInMillis()); datePicker.setMaxDate(maxDate.getTimeInMillis());


Resolví el problema similar estableciendo el límite del calendario a un año (a partir de la fecha de hoy)

long A_YEAR_MILLISECOND = 12 * 30 * 24 * 60 * 60 * 1000L; datePickerDialog.getDatePicker().setMaxDate(Calendar.getInstance().getTimeInMillis() + A_YEAR_MILLISECOND); datePickerDialog.getDatePicker().setMinDate(Calendar.getInstance().getTimeInMillis());


Tenía un problema similar con setMinDate, esto lo resolvió:

int year=2017, month=1, day=1; // for min. date: 1. feb. 2017 Calendar cal = Calendar.getInstance(); cal.set( year, month, day, 0, 0, 0 ); //hour=0 min=0 sec=0 datePickerDialog.getDatePicker().setMinDate(cal.getTimeInMillis());