Android:DatePicker中的StackOverflower错误
我加入时间选择器和日期选择器。除了我必须加上截止日期的限制。不幸的是,我犯了一个我无法处理的错误。也许有人能帮忙。。。 datePicker.updateDate(oldy、oldm、oldd)上出现错误 我的对话框DateTimePicker中的代码:Android:DatePicker中的StackOverflower错误,android,datepicker,stack-overflow,Android,Datepicker,Stack Overflow,我加入时间选择器和日期选择器。除了我必须加上截止日期的限制。不幸的是,我犯了一个我无法处理的错误。也许有人能帮忙。。。 datePicker.updateDate(oldy、oldm、oldd)上出现错误 我的对话框DateTimePicker中的代码: datePicker = (DatePicker) findViewById(R.id.datePickerDate); timePicker = (TimePicker) findViewById(R.id.timeP
datePicker = (DatePicker) findViewById(R.id.datePickerDate);
timePicker = (TimePicker) findViewById(R.id.timePickerTime);
datePicker.init(DAFAULT_START_YEAR, DEFAULT_START_MONTH, DEFAULT_START_DAY,
new OnDateChangedListener() {
@Override
public void onDateChanged(final DatePicker view, final int year, final int monthOfYear,
final int dayOfMonth) {
Date currChoice = new Date(year, monthOfYear, dayOfMonth);
if (currChoice.before(currentDateTime) || currChoice.equals(currentDateTime)) {
//do some things
} else {
datePicker.updateDate(oldy, oldm, oldd);
}
}
});
datePicker.updateDate(y, m, d);
错误:
Thread [<1> main] (Suspended (exception StackOverflowError))
DataSetObservable.notifyChanged() line: 37
CalendarView$WeeksAdapter(BaseAdapter).notifyDataSetChanged() line: 50
CalendarView$WeeksAdapter.setSelectedDay(Calendar) line: 1005
CalendarView.goTo(Calendar, boolean, boolean, boolean) line: 750
CalendarView.setDate(long, boolean, boolean) line: 623
DatePicker.updateCalendarView() line: 636
DatePicker.updateDate(int, int, int) line: 496
DateTimeDialog.init() line: 151
DateTimeDialog.<init>(Context, String) line: 88
MyActivity$3.onClick(View) line: 395
EditText(View).performClick() line: 3117
View$PerformClick.run() line: 11941
ViewRoot(Handler).handleCallback(Message) line: 587
ViewRoot(Handler).dispatchMessage(Message) line: 92
Looper.loop() line: 132
ActivityThread.main(String[]) line: 4123
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]
Method.invoke(Object, Object...) line: 491
ZygoteInit$MethodAndArgsCaller.run() line: 841
ZygoteInit.main(String[]) line: 599
NativeStart.main(String[]) line: not available [native method]
从内部调用
onDateChanged()
会导致一次又一次地触发相同的事件。这会一直发生,直到堆栈空间用完为止
在onDateChanged()实现中使用布尔变量或其他内容,以避免递归触发事件。从
onDateChanged()内部调用updateDate()。这会一直发生,直到堆栈空间用完为止
在onDateChanged()实现中使用布尔变量或其他内容以避免递归触发事件。您正在从onDateChanged
调用updateDate
,导致无限递归。看起来你在试图过滤掉过去的日期。也许可以试试
更新
更准确地说,您的方法没有太多缺陷。程序员通常必须从侦听器本身设置值。您遇到的问题是,您没有做任何事情来终止递归。请看下面的代码:
Date currChoice = new Date(year, monthOfYear, dayOfMonth);
if (currChoice.before(currentDateTime) || currChoice.equals(currentDateTime)) {
//do some things
} else {
datePicker.updateDate(oldy, oldm, oldd);
}
如果当前选择的日期小于或等于当前日期,则将该值设置回以前的值,但不检查以前的值是否也小于或等于当前日期。这意味着,如果旧日期小于当前日期,则将永远递归。第二次检查将纠正此问题:
Date currChoice = new Date(year, monthOfYear, dayOfMonth);
Date oldChoice = new Date(oldy, oldm, oldd);
if (currChoice.before(currentDateTime) || currChoice.equals(currentDateTime)) {
//do some things
} else if (oldChoice.before(currentDateTime) || oldChoice.equals(currentDateTime)) {
// Maybe do nothing, maybe set the date to tomorrow. Your call.
} else {
datePicker.updateDate(oldy, oldm, oldd);
}
当然,我仍然认为setMinDate
是您的最佳选择,但这就是实际情况。您从onDateChanged
调用updateDate
,导致无限递归。看起来你在试图过滤掉过去的日期。也许可以试试
更新
更准确地说,您的方法没有太多缺陷。程序员通常必须从侦听器本身设置值。您遇到的问题是,您没有做任何事情来终止递归。请看下面的代码:
Date currChoice = new Date(year, monthOfYear, dayOfMonth);
if (currChoice.before(currentDateTime) || currChoice.equals(currentDateTime)) {
//do some things
} else {
datePicker.updateDate(oldy, oldm, oldd);
}
如果当前选择的日期小于或等于当前日期,则将该值设置回以前的值,但不检查以前的值是否也小于或等于当前日期。这意味着,如果旧日期小于当前日期,则将永远递归。第二次检查将纠正此问题:
Date currChoice = new Date(year, monthOfYear, dayOfMonth);
Date oldChoice = new Date(oldy, oldm, oldd);
if (currChoice.before(currentDateTime) || currChoice.equals(currentDateTime)) {
//do some things
} else if (oldChoice.before(currentDateTime) || oldChoice.equals(currentDateTime)) {
// Maybe do nothing, maybe set the date to tomorrow. Your call.
} else {
datePicker.updateDate(oldy, oldm, oldd);
}
当然,我仍然认为setMinDate
是您最好的选择,但这就是实际发生的情况。您正在从侦听器内部调用datePicker.updateDate(..),导致侦听器再次被触发,即一个将耗尽堆栈的循环。您正在调用datePicker.updateDate(..)从监听器内部导致监听器再次被触发,也就是说,一个循环会耗尽你的堆栈。@鲁本我们都是从某个点开始的,并且都犯了错误。没必要这么小气。Stackover flow的目的是帮助人们学习,而不是因为无知而惩罚他们。我很清楚stackoverflow.com的目的。谢谢@Kurtis,我不同意我是在“刻薄”甚至惩罚他们。@Reuben我们都是从某个点开始的,都犯了错误。没必要这么小气。Stackover flow的目的是帮助人们学习,而不是因为无知而惩罚他们。我很清楚stackoverflow.com的目的。谢谢@Kurtis,我不同意我是“刻薄”甚至是惩罚。非常感谢你的帮助和宽容:)我必须使用API 10,方法setMinDate可从API 11获得…非常感谢您的帮助和耐心:)我必须使用API 10,方法setMinDate可从API 11获得。。。