2014-04-30 7 views
0

대개 사람들과 마찬가지로 DatepickerDialog에없는 사용자 지정 대화 상자에 날짜 선택 도구가 만들어졌습니다. 문제는 과거의 날짜를 제한하려고 할 때 런타임 응용 프로그램이 충돌 할 때 첨부 된 코드를 로그 아웃합니다. 내 코드에서 빠진 것이있을 수 있습니다. [attach], 도와주세요.사용자 지정 대화 상자의 날짜 선택 도구 (DatePickerDialog가 아님) 과거 날짜가 작동하지 않는 제한

04-30 10:24:16.278: D/dalvikvm(19320): GC_CONCURRENT freed 1764K, 27% free 9106K/12412K, paused 2ms+2ms, total 32ms 
04-30 10:24:16.278: D/dalvikvm(19320): WAIT_FOR_CONCURRENT_GC blocked 22ms 
04-30 10:24:16.282: E/AndroidRuntime(19320): FATAL EXCEPTION: main 
04-30 10:24:16.282: E/AndroidRuntime(19320): java.lang.StackOverflowError 
04-30 10:24:16.282: E/AndroidRuntime(19320): at android.text.SpannableStringBuilder.getChars(SpannableStringBuilder.java:913) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at android.text.TextUtils.getChars(TextUtils.java:75) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at android.text.method.ReplacementTransformationMethod$ReplacementCharSequence.getChars(ReplacementTransformationMethod.java:151) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at android.text.TextUtils.getChars(TextUtils.java:75) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at android.text.TextUtils.indexOf(TextUtils.java:108) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at android.text.StaticLayout.generate(StaticLayout.java:182) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at android.text.DynamicLayout.reflow(DynamicLayout.java:288) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at android.text.DynamicLayout.<init>(DynamicLayout.java:174) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at android.widget.TextView.makeSingleLayout(TextView.java:5952) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at android.widget.TextView.makeNewLayout(TextView.java:5850) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at android.widget.TextView.checkForRelayout(TextView.java:6391) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at android.widget.TextView.setText(TextView.java:3672) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at android.widget.TextView.setText(TextView.java:3530) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at android.widget.EditText.setText(EditText.java:80) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at android.widget.TextView.setText(TextView.java:3505) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at android.widget.NumberPicker.updateInputTextView(NumberPicker.java:1763) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at android.widget.NumberPicker.setDisplayedValues(NumberPicker.java:1381) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at android.widget.DatePicker.updateSpinners(DatePicker.java:642) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at android.widget.DatePicker.updateDate(DatePicker.java:545) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at com.view.MyProject.SchedulesActivity$28.onDateChanged(SchedulesActivity.java:1328) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at android.widget.DatePicker.notifyDateChanged(DatePicker.java:699) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at android.widget.DatePicker.updateDate(DatePicker.java:547) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at com.view.MyProject.SchedulesActivity$28.onDateChanged(SchedulesActivity.java:1328) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at android.widget.DatePicker.notifyDateChanged(DatePicker.java:699) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at android.widget.DatePicker.updateDate(DatePicker.java:547) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at com.view.MyProject.SchedulesActivity$28.onDateChanged(SchedulesActivity.java:1328) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at android.widget.DatePicker.notifyDateChanged(DatePicker.java:699) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at android.widget.DatePicker.updateDate(DatePicker.java:547) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at com.view.MyProject.SchedulesActivity$28.onDateChanged(SchedulesActivity.java:1328) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at android.widget.DatePicker.notifyDateChanged(DatePicker.java:699) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at android.widget.DatePicker.updateDate(DatePicker.java:547) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at com.view.MyProject.SchedulesActivity$28.onDateChanged(SchedulesActivity.java:1328) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at android.widget.DatePicker.notifyDateChanged(DatePicker.java:699) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at android.widget.DatePicker.updateDate(DatePicker.java:547) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at com.view.MyProject.SchedulesActivity$28.onDateChanged(SchedulesActivity.java:1328) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at android.widget.DatePicker.notifyDateChanged(DatePicker.java:699) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at android.widget.DatePicker.updateDate(DatePicker.java:547) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at com.view.MyProject.SchedulesActivity$28.onDateChanged(SchedulesActivity.java:1328) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at android.widget.DatePicker.notifyDateChanged(DatePicker.java:699) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at android.widget.DatePicker.updateDate(DatePicker.java:547) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at com.view.MyProject.SchedulesActivity$28.onDateChanged(SchedulesActivity.java:1328) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at android.widget.DatePicker.notifyDateChanged(DatePicker.java:699) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at android.widget.DatePicker.updateDate(DatePicker.java:547) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at com.view.MyProject.SchedulesActivity$28.onDateChanged(SchedulesActivity.java:1328) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at android.widget.DatePicker.notifyDateChanged(DatePicker.java:699) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at android.widget.DatePicker.updateDate(DatePicker.java:547) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at com.view.MyProject.SchedulesActivity$28.onDateChanged(SchedulesActivity.java:1328) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at android.widget.DatePicker.notifyDateChanged(DatePicker.java:699) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at android.widget.DatePicker.updateDate(DatePicker.java:547) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at com.view.MyProject.SchedulesActivity$28.onDateChanged(SchedulesActivity.java:1328) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at android.widget.DatePicker.notifyDateChanged(DatePicker.java:699) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at android.widget.DatePicker.updateDate(DatePicker.java:547) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at com.view.MyProject.SchedulesActivity$28.onDateChanged(SchedulesActivity.java:1328) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at android.widget.DatePicker.notifyDateChanged(DatePicker.java:699) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at android.widget.DatePicker.updateDate(DatePicker.java:547) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at com.view.MyProject.SchedulesActivity$28.onDateChanged(SchedulesActivity.java:1328) 
04-30 10:24:16.282: E/AndroidRuntime(19320): at android.widget.DatePicker.notifyDateChanged(

코드 :

, view.UpdateDate()가 초기화에서 호출 할 수 없습니다 (익명의 내부 클래스 형 ..) 충돌이 이유 을, 나쁜 프로그래밍에 대한 죄송합니다
DatePicker datePicker = (DatePicker)datePickerDialog.findViewById(R.id.datepicker); 
     getCurrDate(); 

     datePicker.init(year, month, day, new OnDateChangedListener() { 

      @Override 
      public void onDateChanged(DatePicker view, int selected_year, int selected_month, 
        int selected_day) { 
       // TODO Auto-generated method stub 
      /// getCurrDate(); 
       if (selected_year < currYear) 
        view.updateDate(currYear, currMonth, currDay); 


       if (selected_month < currMonth && selected_year == currYear); 
        view.updateDate(currYear, currMonth, currDay); 

       if (selected_month < currDay && year == currYear && selected_month == currMonth) 
        view.updateDate(currYear, currMonth, currDay); 

       selectedDate = ""+(selected_month+1)+"/"+selected_day+"/"+selected_year; 
       datePicker_TV.setText(selectedDate); 

       repeatDlgDoneBtn.setTextColor(getResources().getColor(R.color.Dialog_cancel_blue)); 
       repeatDlgDoneBtn.setEnabled(true); 
       getSelectedWeek(); 
      } 
     });  
     datePicker.setCalendarViewShown(false);   
     datePicker.setDescendantFocusability(DatePicker.FOCUS_BLOCK_DESCENDANTS); 
     datePickerDialog.show(); 

    } 

답변

0

같은 논리 불구하고 DatePickerDialog 객체를 다음과 같이 가져갈 때 적용 할 수 있습니다.

new DatePickerDialog.OnDateSetListener() { 

      @Override 
      public void onDateSet(DatePicker view, int year, int monthOfYear, 
        int dayOfMonth) { 
       // TODO Auto-generated 
................................. 
................................. 
same logic as above code works for this scenario. 

But i had used a Custom Dialog to increase UI Flexibility, so here's the perfect solution: 
1. 1st get the Time in Millis for the Past Date[Called Min Date to be set in Date Picker] 
2. If it is Current Date then do not use current time System.getCurrentTimeinMillis(); as it's always greater than the Actual date's Initial Time so using this will crash DatePicker. Instead send this current date to a date to time converter function as i had mentioned below: 





public void getCurrDate() 
    { 
    Calendar c = Calendar.getInstance(); 
      year = c.get(Calendar.YEAR); 
      month = c.get(Calendar.MONTH); 
      day = c.get(Calendar.DAY_OF_MONTH); 

      return ""+(month+1)+"/"+day+"/"+year; 
    } 
    String input = getCurrDate(); 
      Date date; 
      try { 
       date = new SimpleDateFormat("MM/dd/yyyy", Locale.ENGLISH).parse(input); 
       long milliseconds = date.getTime(); 
       if(milliseconds>0){ 
        datePicker.setMinDate(milliseconds); 
    //This Function will work fine, to set a future constraint use setMaxDate(long time); 
       } 
       else 
       { 
           //whatever else cond... 
       } 

      } catch (ParseException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      }