2011-10-31 22 views
0

我加入timepicker和日期選擇器。除了我必須添加限制迄今。不幸,我得到了一個錯誤,我無法處理。也許有人可以幫助... datePicker.updateDate(oldy,oldm,oldd)發生錯誤;從我的對話框的DateTimePicker安卓:在的StackOverflowError的DatePicker

代碼:

 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] 

的logcat:

10-31 14:53:49.390: E/AndroidRuntime(5348): FATAL EXCEPTION: main 
10-31 14:53:49.390: E/AndroidRuntime(5348): java.lang.StackOverflowError 
10-31 14:53:49.390: E/AndroidRuntime(5348):  at android.view.View.invalidate(View.java:7178) 
10-31 14:53:49.390: E/AndroidRuntime(5348):  at android.view.View.invalidate(View.java:7159) 
10-31 14:53:49.390: E/AndroidRuntime(5348):  at android.widget.TextView.invalidateCursor(TextView.java:3826) 
10-31 14:53:49.390: E/AndroidRuntime(5348):  at android.widget.TextView.spanChange(TextView.java:6933) 
10-31 14:53:49.390: E/AndroidRuntime(5348):  at android.widget.TextView$ChangeWatcher.onSpanAdded(TextView.java:7059) 
10-31 14:53:49.390: E/AndroidRuntime(5348):  at android.text.SpannableStringBuilder.sendSpanAdded(SpannableStringBuilder.java:918) 
10-31 14:53:49.390: E/AndroidRuntime(5348):  at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:615) 
10-31 14:53:49.390: E/AndroidRuntime(5348):  at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:518) 
10-31 14:53:49.390: E/AndroidRuntime(5348):  at android.text.Selection.setSelection(Selection.java:74) 
10-31 14:53:49.390: E/AndroidRuntime(5348):  at android.text.Selection.setSelection(Selection.java:85) 
10-31 14:53:49.390: E/AndroidRuntime(5348):  at android.text.method.ArrowKeyMovementMethod.initialize(ArrowKeyMovementMethod.java:288) 
10-31 14:53:49.390: E/AndroidRuntime(5348):  at android.widget.TextView.setText(TextView.java:2814) 
10-31 14:53:49.390: E/AndroidRuntime(5348):  at android.widget.TextView.setText(TextView.java:2691) 
10-31 14:53:49.390: E/AndroidRuntime(5348):  at android.widget.EditText.setText(EditText.java:78) 
10-31 14:53:49.390: E/AndroidRuntime(5348):  at android.widget.TextView.setText(TextView.java:2666) 
10-31 14:53:49.390: E/AndroidRuntime(5348):  at android.widget.NumberPicker.updateInputTextView(NumberPicker.java:1427) 
10-31 14:53:49.390: E/AndroidRuntime(5348):  at android.widget.NumberPicker.setDisplayedValues(NumberPicker.java:1041) 
10-31 14:53:49.390: E/AndroidRuntime(5348):  at android.widget.DatePicker.updateSpinners(DatePicker.java:593) 
10-31 14:53:49.390: E/AndroidRuntime(5348):  at android.widget.DatePicker.updateDate(DatePicker.java:495) 
10-31 14:53:49.390: E/AndroidRuntime(5348):  at myapp.dialog.DateTimeDialog$3.onDateChanged(DateTimeDialog.java:146) 
10-31 14:53:49.390: E/AndroidRuntime(5348):  at android.widget.DatePicker.notifyDateChanged(DatePicker.java:666) 
10-31 14:53:49.390: E/AndroidRuntime(5348):  at android.widget.DatePicker.updateDate(DatePicker.java:497) 
10-31 14:53:49.390: E/AndroidRuntime(5348):  at myapp.dialog.DateTimeDialog$3.onDateChanged(DateTimeDialog.java:146) 
10-31 14:53:49.390: E/AndroidRuntime(5348):  at android.widget.DatePicker.notifyDateChanged(DatePicker.java:666) 
10-31 14:53:49.390: E/AndroidRuntime(5348):  at android.widget.DatePicker.updateDate(DatePicker.java:497) 
10-31 14:53:49.390: E/AndroidRuntime(5348):  at myapp.dialog.DateTimeDialog$3.onDateChanged(DateTimeDialog.java:146) 
10-31 14:53:49.390: E/AndroidRuntime(5348):  at android.widget.DatePicker.notifyDateChanged(DatePicker.java:666) 
etc 
+0

我使用Android API 10 – user1022084

+0

要調用從監聽器裏datePicker.updateDate(..)造成你的聽衆被再次觸發,即一個循環,會用盡你的籌碼。 – Jens

回答

2

您對updateDate()從內onDateChanged()導致同樣事件,火災,再次調用並一次又一次。發生這種情況,直到您用盡堆棧空間。

使用布爾變量或東西在你的onDateChanged()的實現,以避免遞歸觸發事件。

+0

非常感謝。我剛開始編程...... – user1022084

+0

@Reuben我們都在某個點或另一個點開始並犯了錯誤。沒有必要對此有所瞭解。 Stackover流程的目的是幫助人們學習,而不是因爲無知而對他們進行懲罰。 –

+0

我很清楚stackoverflow.com的目的,謝謝@Kurtis,不同意我的意思是甚至是懲罰。 –

2

你打電話從onDateChangedupdateDate,引起無限遞歸。它看起來像你試圖過濾掉過去的日期。也許試試DatePicker.setMinDate

更新

是一個小更準確,你的方法是不是太有缺陷的。程序員經常不得不從聽衆本身設置值。你遇到的問題是你沒有做任何事情來殺死遞歸。看看你的代碼如下:

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是您最好的選擇,但這是實際發生的。

+0

非常感謝您的幫助和忍耐:)我必須使用API​​ 10,方法setMinDate可從API 11 ... – user1022084