2012-11-14 10 views
6

DatePickerDialog를 사용하고 있으며 사용자가 이전 24 시간 또는 다음 24 시간 이내에 만 날짜를 선택할 수 있도록 최소 및 최대 날짜를 설정하려고합니다.DatePickerDialog에서 DatePicker setMaxDate()를 사용할 때 NullPointerException이 발생했습니다.

다음은 코드입니다. 2.2 장치에서 실행 할 때 잘 작동

private void showDatePickerDialog() { 
    DatePickerDialog.OnDateSetListener listener = new DatePickerDialog.OnDateSetListener() { 
     @Override 
     public void onDateSet(DatePicker view, int year, int monthOfYear, 
           int dayOfMonth) { 
      calendar.set(Calendar.YEAR, year); 
      calendar.set(Calendar.MONTH, monthOfYear); 
      calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth); 
      onCalendarChanged(); 
     } 
    }; 

    DatePickerDialog dialog = new DatePickerDialog(this, 
                listener, 
                calendar.get(Calendar.YEAR), 
                calendar.get(Calendar.MONTH), 
                calendar.get(Calendar.DAY_OF_MONTH)); 
    setDatePickerDialogRange(dialog); 
    dialog.show(); 
} 

@SuppressLint("NewApi") 
private void setDatePickerDialogRange(DatePickerDialog dialog) { 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
     DatePicker picker = dialog.getDatePicker(); 
     long oneDayMilliseconds = 24 * 60 * 60 * 1000; 
     long nowMilliseconds = new Date().getTime(); 
     long minDate = nowMilliseconds - oneDayMilliseconds; 
     long maxDate = nowMilliseconds + oneDayMilliseconds; 
     picker.setMinDate(minDate); 
     picker.setMaxDate(maxDate); 
    } 
} 

. (안드로이드 3.0 이상에서 실행중인 경우에만 최소/최대 범위를 설정하려고 시도합니다)하지만, 4.0.4 장치 (갤럭시 탭 2 7.0)이 예외가 발생합니다.

11-14 07:58:08.917: E/AndroidRuntime(16611): FATAL EXCEPTION: main 
11-14 07:58:08.917: E/AndroidRuntime(16611): java.lang.NullPointerException 
11-14 07:58:08.917: E/AndroidRuntime(16611): at android.widget.CalendarView.onScroll(CalendarView.java:910) 
11-14 07:58:08.917: E/AndroidRuntime(16611): at android.widget.CalendarView.access$600(CalendarView.java:74) 
11-14 07:58:08.917: E/AndroidRuntime(16611): at android.widget.CalendarView$2.onScroll(CalendarView.java:771) 
11-14 07:58:08.917: E/AndroidRuntime(16611): at android.widget.AbsListView.invokeOnItemScrollListener(AbsListView.java:1391) 
11-14 07:58:08.917: E/AndroidRuntime(16611): at android.widget.ListView.layoutChildren(ListView.java:1705) 
11-14 07:58:08.917: E/AndroidRuntime(16611): at android.widget.AbsListView.onLayout(AbsListView.java:2040) 
11-14 07:58:08.917: E/AndroidRuntime(16611): at android.view.View.layout(View.java:11330) 
11-14 07:58:08.917: E/AndroidRuntime(16611): at android.view.ViewGroup.layout(ViewGroup.java:4235) 
11-14 07:58:08.917: E/AndroidRuntime(16611): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1644) 
11-14 07:58:08.917: E/AndroidRuntime(16611): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1502) 
11-14 07:58:08.917: E/AndroidRuntime(16611): at android.widget.LinearLayout.onLayout(LinearLayout.java:1415) 
11-14 07:58:08.917: E/AndroidRuntime(16611): at android.view.View.layout(View.java:11330) 
11-14 07:58:08.917: E/AndroidRuntime(16611): at android.view.ViewGroup.layout(ViewGroup.java:4235) 
11-14 07:58:08.917: E/AndroidRuntime(16611): at android.widget.FrameLayout.onLayout(FrameLayout.java:431) 
11-14 07:58:08.917: E/AndroidRuntime(16611): at android.view.View.layout(View.java:11330) 
11-14 07:58:08.917: E/AndroidRuntime(16611): at android.view.ViewGroup.layout(ViewGroup.java:4235) 
11-14 07:58:08.917: E/AndroidRuntime(16611): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1644) 
11-14 07:58:08.917: E/AndroidRuntime(16611): at android.widget.LinearLayout.layoutHorizontal(LinearLayout.java:1633) 
11-14 07:58:08.917: E/AndroidRuntime(16611): at android.widget.LinearLayout.onLayout(LinearLayout.java:1417) 
11-14 07:58:08.917: E/AndroidRuntime(16611): at android.view.View.layout(View.java:11330) 
11-14 07:58:08.917: E/AndroidRuntime(16611): at android.view.ViewGroup.layout(ViewGroup.java:4235) 
11-14 07:58:08.917: E/AndroidRuntime(16611): at android.widget.FrameLayout.onLayout(FrameLayout.java:431) 
11-14 07:58:08.917: E/AndroidRuntime(16611): at android.view.View.layout(View.java:11330) 
11-14 07:58:08.917: E/AndroidRuntime(16611): at android.view.ViewGroup.layout(ViewGroup.java:4235) 
11-14 07:58:08.917: E/AndroidRuntime(16611): at android.widget.FrameLayout.onLayout(FrameLayout.java:431) 
11-14 07:58:08.917: E/AndroidRuntime(16611): at android.view.View.layout(View.java:11330) 
11-14 07:58:08.917: E/AndroidRuntime(16611): at android.view.ViewGroup.layout(ViewGroup.java:4235) 
11-14 07:58:08.917: E/AndroidRuntime(16611): at android.widget.FrameLayout.onLayout(FrameLayout.java:431) 
11-14 07:58:08.917: E/AndroidRuntime(16611): at android.view.View.layout(View.java:11330) 
11-14 07:58:08.917: E/AndroidRuntime(16611): at android.view.ViewGroup.layout(ViewGroup.java:4235) 
11-14 07:58:08.917: E/AndroidRuntime(16611): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1644) 
11-14 07:58:08.917: E/AndroidRuntime(16611): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1502) 
11-14 07:58:08.917: E/AndroidRuntime(16611): at android.widget.LinearLayout.onLayout(LinearLayout.java:1415) 
11-14 07:58:08.917: E/AndroidRuntime(16611): at android.view.View.layout(View.java:11330) 
11-14 07:58:08.917: E/AndroidRuntime(16611): at android.view.ViewGroup.layout(ViewGroup.java:4235) 
11-14 07:58:08.917: E/AndroidRuntime(16611): at android.widget.FrameLayout.onLayout(FrameLayout.java:431) 
11-14 07:58:08.917: E/AndroidRuntime(16611): at android.view.View.layout(View.java:11330) 
11-14 07:58:08.917: E/AndroidRuntime(16611): at android.view.ViewGroup.layout(ViewGroup.java:4235) 
11-14 07:58:08.917: E/AndroidRuntime(16611): at android.widget.FrameLayout.onLayout(FrameLayout.java:431) 
11-14 07:58:08.917: E/AndroidRuntime(16611): at android.view.View.layout(View.java:11330) 
11-14 07:58:08.917: E/AndroidRuntime(16611): at android.view.ViewGroup.layout(ViewGroup.java:4235) 
11-14 07:58:08.917: E/AndroidRuntime(16611): at android.widget.FrameLayout.onLayout(FrameLayout.java:431) 
11-14 07:58:08.917: E/AndroidRuntime(16611): at android.view.View.layout(View.java:11330) 
11-14 07:58:08.917: E/AndroidRuntime(16611): at android.view.ViewGroup.layout(ViewGroup.java:4235) 
11-14 07:58:08.917: E/AndroidRuntime(16611): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1548) 
11-14 07:58:08.917: E/AndroidRuntime(16611): at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2505) 
11-14 07:58:08.917: E/AndroidRuntime(16611): at android.os.Handler.dispatchMessage(Handler.java:99) 
11-14 07:58:08.917: E/AndroidRuntime(16611): at android.os.Looper.loop(Looper.java:137) 
11-14 07:58:08.917: E/AndroidRuntime(16611): at android.app.ActivityThread.main(ActivityThread.java:4514) 
11-14 07:58:08.917: E/AndroidRuntime(16611): at java.lang.reflect.Method.invokeNative(Native Method) 
11-14 07:58:08.917: E/AndroidRuntime(16611): at java.lang.reflect.Method.invoke(Method.java:511) 
11-14 07:58:08.917: E/AndroidRuntime(16611): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790) 
11-14 07:58:08.917: E/AndroidRuntime(16611): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557) 
11-14 07:58:08.917: E/AndroidRuntime(16611): at dalvik.system.NativeStart.main(Native Method) 

이 문제가 즉시 발생합니다. DatePickerDialog가 표시되지 않습니다.

setMaxDate() 행을 주석 처리하면 정상적으로 작동합니다. 이 경우 최저 날짜가 준수됩니다.

setMaxDate(nowMilliseconds)으로 변경하면 여전히 NullPointerException이 발생합니다.

+1

호기심 벗어남, 기기가 GMT 표준 시간대로 설정되어 있습니까? – iTurki

+0

장치가 미국 동부 표준시 (GMT-5 : 00)로 설정됩니다. 방금 GMT로 시간대를 변경했으며 여전히 NPE를 얻습니다. –

+0

JFYI 테스트 프로젝트에 코드를 복사했으며 정상적으로 실행되었습니다. 에뮬레이터 SDK 16에서 실행했습니다. – Luis

답변

0

에 한번 교체 :

setDatePickerDialogRange(dialog); 
dialog.show(); 

에 :

dialog.show(); 
someView.post(new Runnable() { 
    public void run() { 
    setDatePickerDialogRange(dialog); 
    } 
}); 

(있을 경우 일부 View, 또는 Handler 임)이 될 때까지 setDatePickerDialogRange()에 대한 호출을 지연합니다 대화 상자가 렌더링 된 후 문제 해결 방법이 될 수 있습니다.

+0

좋은 생각 이었지만 도움이되지 못했습니다. 나는 아직도 NPE를 얻는다. 'postDelayed (r, 2000)'을 시도하면 몇 초 동안 대화 상자가 표시되지만 Runnable이 실행될 때 NPE가 표시됩니다. –

+0

@KristopherJohnson : 음, 드라트. 개발자가이 시나리오를 테스트하지 않은 것 같습니다. 당신이 망했다고 의심합니다. 샘플 프로젝트를 만들고 http://b.android.com에 게시하고 언젠가는 고쳐지기를 바랍니다 ... – CommonsWare

10

꽤 오랫동안이 작업을 해왔습니다. 이것은 Android의 버그입니다. 그냥 달력보기를 끄고 당신은 괜찮을거야 :

picker.setCalendarViewShown(false); 
+0

에는 캘린더보기를 표시 할 수 있는지 여부를 확인할 수있는 조건이 있으므로 충돌하지 않습니다. 나는 대부분의 사용자들에게 잘 작동하기 때문에 모든 사람들을위한 캘린더보기를 끄고 싶지 않다. –

+0

나는 KITKAT (API 19)에서 같은 문제를 겪었다. 감사. if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) { picker.setCalendarViewShown (false); } – Herman

0
I have seen an issue.. 

DatePicker에서 setMinDate()setMaxDate() 작동하지 않는 새로운 날짜 이전 최소/최대 날짜

과 같은 해 주시기 바랍니다 때 아래 링크를 참조하십시오. Bugs on DatePicker setMinDate() and setMaxDate()

+2

NullPointerException을 설명합니까? –

0

이 기능은 => API 19. 아래에서 작동하는지 모르겠다. 감사합니다. @JGGerrits.

Calendar min = (Calendar) minDate.clone(); 
Calendar max = (Calendar) maxDate.clone(); 
Calendar selected = (Calendar) selectedDate.clone(); 
min.set(Calendar.HOUR_OF_DAY, 0); 
max.set(Calendar.HOUR_OF_DAY, 23); 
selected.set(Calendar.HOUR_OF_DAY, 12); 

DatePickerDialog datePickerDialog = 
     new DatePickerDialog(context, callBack, selected); 

if(Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) { 
    datePickerDialog.getDatePicker().setCalendarViewShown(false); 
} 

datePickerDialog.getDatePicker().setMinDate(min.getTimeInMillis()); 
datePickerDialog.getDatePicker().setMaxDate(max.getTimeInMillis()); 
datePickerDialog.show(); 
관련 문제