2012-11-14 7 views
6

में डेटपिकर सेटमैक्सडेट() का उपयोग करते समय NullPointerException मैं डेटपिकरडियलॉग का उपयोग कर रहा हूं, और मैं न्यूनतम और अधिकतम तिथियां सेट करने की कोशिश कर रहा हूं जैसे कि उपयोगकर्ता पिछले 24 घंटों या अगले 24 घंटों के भीतर ही एक तिथि चुन सकता है।DatePickerDialog

यहां कोड है। (ध्यान दें कि केवल न्यूनतम/अधिकतम सीमा निर्धारित करने की कोशिश करता है कि अगर एंड्रॉयड 3.0 या उच्चतर पर चल रहा है।)

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); 
    } 
} 

यह ठीक काम करता है जब एक 2.2 डिवाइस पर चल रहा है, लेकिन एक 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

जिज्ञासा से, डिवाइस जीएमटी समय क्षेत्र पर सेट है? – iTurki

+0

डिवाइस यूएस पूर्वी मानक समय (जीएमटी -5: 00) पर सेट है। मैंने अभी अपना टाइमज़ोन जीएमटी में बदल दिया है, और मुझे अभी भी एनपीई मिल गया है। –

+0

जेएफवाईआई मैंने आपके कोड को एक परीक्षण प्रोजेक्ट में कॉपी किया है और यह ठीक है। मैंने इसे एम्यूलेटर एसडीके 16 में चलाया है। – Luis

उत्तर

0

कोशिश की जगह:

setDatePickerDialogRange(dialog); 
dialog.show(); 

रहे हैं:

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

(जहां कुछ View, या एक Handler है अगर आपके पास है)

यह जब तक setDatePickerDialogRange() करने के लिए कॉल में विलंब होगा संवाद के बाद प्रस्तुत किया गया है और आपकी समस्या के लिए एक समाधान हो सकता है।

+0

अच्छा विचार है, लेकिन इससे मदद नहीं मिली। मुझे अभी भी एनपीई मिल गया है। यदि मैं 'पोस्टडेलेड (आर, 2000)' का प्रयास करता हूं, तो संवाद कुछ सेकंड के लिए प्रदर्शित होता है, लेकिन रनवेबल रन होने पर एनपीई का होता है। –

+0

@ क्रिस्टोफर जॉनसन: ठीक है, ड्रैट। ऐसा लगता है कि डेवलपर ने इस परिदृश्य का परीक्षण नहीं किया था। मुझे संदेह है कि आप खराब हैं। एक नमूना प्रोजेक्ट बनाएं, इसे http://b.android.com पर पोस्ट करें, और उम्मीद है कि यह किसी दिन तय हो जाएगा ... – CommonsWare

10

काफी समय से इस पर काम कर रहे थे। यह एंड्रॉइड में एक बग है। बस कैलेंडर देखें बंद कर देते हैं और आप ठीक हो जाओगे:

picker.setCalendarViewShown(false); 
+0

क्या यह जांचने के लिए कोई शर्त है कि क्या हम कैलेंडर दृश्य दिखा सकते हैं ताकि यह क्रैश न हो? मैं सभी के लिए कैलेंडर दृश्य बंद नहीं करना चाहता क्योंकि यह अधिकांश उपयोगकर्ताओं के लिए ठीक काम करता है –

+0

मेरे पास किटकैट (एपीआई 1 9) में एक ही समस्या थी, और यह काम करता है! धन्यवाद। अगर (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

यह काम किया> = एपीआई 19. पता नहीं है कि क्या काम करता है। धन्यवाद @ जेजीजीरिट्स।

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(); 
संबंधित मुद्दे