Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/206.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:DatePicker中的StackOverflower错误_Android_Datepicker_Stack Overflow - Fatal编程技术网

Android:DatePicker中的StackOverflower错误

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.updateDate(oldy、oldm、oldd)上出现错误

我的对话框DateTimePicker中的代码:

        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获得。。。