Ich habe ein Zeitintervall bestehend aus einem Anfangs- und einem Enddatum. Ich habe eine Möglichkeit, den Benutzer diese Daten über DatePickerDialogs festlegen zu lassen. Hier ist der Code der Methode, die erstellt und zeigt die Dialoge:DatePicker.setMinDate (long minDate) löst IllegalArgumentException aus: Zeit nicht zwischen
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));
}
Der Wert des beginning
Variable bestimmt, ob die Benutzer entschieden haben, den Anfang oder das Enddatum des Intervalls zu bearbeiten. Diese someTimeDuringYear1
und ähnliche sind Mitgliedsvariablen, die sich auf das Anfangsdatum beziehen, someTimeDuringYear2
und ähnliche beziehen sich auf das Enddatum des Intervalls. Alle sind voreingestellt, bevor dieser Dialog erstellt und angezeigt wird.
Die Ausnahme wird beim Bearbeiten des Anfangs- und Endintervalls ausgelöst. Angenommen, ich möchte das Enddatum des Intervalls bearbeiten. Alles funktioniert perfekt, bis ich das Datum auf das letzte Datum setze, das mir erlaubt ist. Wenn ich das mache und bestätige, scheint alles noch in Ordnung, aber wenn ich versuche, das Enddatum des Intervalls erneut zu bearbeiten, stürzt die Anwendung ab und die Ausnahme wird ausgelöst. (Das gleiche passiert, wenn ich das Intervall des Anfangsdatum bis zum letzten erlaubt Datum festgelegt und dann versuchen Sie es erneut zu bearbeiten.)
Hier das Protokoll von LogCat ist:
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)
ich nach Antworten gesucht haben und versuchen, den ganzen Nachmittag eine Lösung zu finden. Jede Hilfe wird geschätzt.
Vielen Dank.
PS: Das ist die erste Frage, die ich hier stelle, also entschuldige ich mich, wenn etwas nicht stimmt. Ich werde gerne fehlende Informationen über das, was passiert, bereitstellen.
EDIT: Merkwürdigerweise, obwohl das Problem auf der Linie wirft, wenn ich versuche, die minDate
zu setzen, scheint es tatsächlich zu sein, dass das Datum ist „größer“ als die maxDate
. Der Grund dafür, dass ich daran glaube, ist, dass, wenn ich someTimeDuringDay2 - 1
statt someTimeDuringDay2
an den Konstruktor DatePickerDialog
übergebe, das Problem weg ist. Aber dann "Tag" Feld in der DatePicker
ist wirklich um eins kleiner als ich es will. Ich brauche es auf someTimeDuringDay2
eingestellt, wenn die DatePickerDialog
angezeigt wird, nicht zu someTimeDuringDay2 - 1
. Aber es scheint ein Problem zu haben, wenn das Datum dasselbe ist wie sein maxDate
.
, dass eine Menge ist Text, der Einfachheit halber, was ist Zeile 344? – Sam
'dpd.getDatePicker(). SetMinDate (cal.getTimeInMillis());' - in der 'else' Klausel – zbr
Ich bin mir nicht sicher, was Sie in Ihrem Code tun, aber die einzige Möglichkeit, die der Fehler für mich sinnvoll ist wenn das Datum von 'someTimeDuringYear/Month/Day2' vor' cal.getTimeInMillis() 'liegt (sogar um eine Millisekunde). Vergleichen Sie die Daten selbst mit 'Log.v (" Compare ", cal.compareTo (calendar.set (someTimeDuringYear2, ...));' – Sam