9

I have an EditText when clicked it should open DatePickerDialog. But in some devices it is crashing randomly. In Crashlytics it is showing it is crashing in some devices with android version 8 and some in version 9. Please let me know where i am doing wrong.

For DatePicker i am setting minimum and maximum date a user can select.

DatePickerDialog dialog = new DatePickerDialog(mContext, date, myCalendar
                    .get(Calendar.YEAR), myCalendar.get(Calendar.MONTH),
                    myCalendar.get(Calendar.DAY_OF_MONTH));

            SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
            inputFormat.setTimeZone(TimeZone.getTimeZone("IST"));
            Date date = new Date();
            try {
                date = inputFormat.parse("2019-01-13T13:00:00Z"); // this is getting from server
            } catch (ParseException e) {
                e.printStackTrace();
            }

            Calendar minCal = Calendar.getInstance();
            minCal.setTime(date);
            dialog.getDatePicker().setMinDate(minCal.getTimeInMillis());
            dialog.getDatePicker().setMaxDate(System.currentTimeMillis());
            // dialog.getDatePicker().setCalendarViewShown(false);
            dialog.show();

This is the crash message i am getting.

Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.widget.SimpleMonthView.getMonthHeight()' on a null object reference
       at android.widget.DayPickerView.onLayout(DayPickerView.java:230)
       at android.view.View.layout(View.java:19962)
       at android.view.ViewGroup.layout(ViewGroup.java:6310)
       at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
       at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
       at android.view.View.layout(View.java:19962)
       at android.view.ViewGroup.layout(ViewGroup.java:6310)
       at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
       at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
       at android.widget.ScrollView.onLayout(ScrollView.java:1552)
       at android.view.View.layout(View.java:19962)
       at android.view.ViewGroup.layout(ViewGroup.java:6310)
       at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1791)
       at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1635)
       at android.widget.LinearLayout.onLayout(LinearLayout.java:1544)
       at android.view.View.layout(View.java:19962)
       at android.view.ViewGroup.layout(ViewGroup.java:6310)
       at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
       at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
       at android.view.View.layout(View.java:19962)
       at android.view.ViewGroup.layout(ViewGroup.java:6310)
       at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
       at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
       at android.view.View.layout(View.java:19962)
       at android.view.ViewGroup.layout(ViewGroup.java:6310)
       at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
       at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
       at android.view.View.layout(View.java:19962)
       at android.view.ViewGroup.layout(ViewGroup.java:6310)
       at com.android.internal.widget.AlertDialogLayout.setChildFrame(AlertDialogLayout.java:356)
       at com.android.internal.widget.AlertDialogLayout.onLayout(AlertDialogLayout.java:349)
       at android.view.View.layout(View.java:19962)
       at android.view.ViewGroup.layout(ViewGroup.java:6310)
       at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
       at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
       at android.view.View.layout(View.java:19962)
       at android.view.ViewGroup.layout(ViewGroup.java:6310)
       at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
       at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
       at android.view.View.layout(View.java:19962)
       at android.view.ViewGroup.layout(ViewGroup.java:6310)
       at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
       at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
       at com.android.internal.policy.DecorView.onLayout(DecorView.java:941)
       at android.view.View.layout(View.java:19962)
       at android.view.ViewGroup.layout(ViewGroup.java:6310)
       at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2671)
       at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2376)
       at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1488)
       at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7182)
       at android.view.Choreographer$CallbackRecord.run(Choreographer.java:935)
       at android.view.Choreographer.doCallbacks(Choreographer.java:747)
       at android.view.Choreographer.doFrame(Choreographer.java:677)
       at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:921)
       at android.os.Handler.handleCallback(Handler.java:790)
       at android.os.Handler.dispatchMessage(Handler.java:99)
       at android.os.Looper.loop(Looper.java:192)
       at android.app.ActivityThread.main(ActivityThread.java:6806)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:445)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:875)
Rajeev Shetty
  • 1,534
  • 1
  • 17
  • 27
  • 1
    You said its working on some devices i.e code is fine . This can be an issue with OS versions .. Are you testing on Custom ROM or Stock Android device ? – ADM Apr 30 '19 at 06:42
  • 1
    `datePickerDialog.getDatePicker().setCalendarViewShown(false);` add this line before seting the minimum and max date – Aabauser Apr 30 '19 at 06:52
  • @ADM, Random crashes are happening with users who are using the app. Majority crash is reported with android version 8.1.0 in crashlytics. For testing purpose i am using a stock android device and a device of lower version 5.1 . It is working fine in both. No issues here in testing. – Rajeev Shetty Apr 30 '19 at 07:05
  • @Aabauser i have added this line `datePickerDialog.getDatePicker().setCalendarViewShown(false);` after setting the minimum and maximum date, but still issue is there . Will use it before and will try. – Rajeev Shetty Apr 30 '19 at 07:09
  • 3
    This happens when the maxDate is smaller then the minDate. Check your dates and make sure your maxDate is "higher". – HB. Apr 30 '19 at 08:35
  • @HB Yes this was the issue. As it was coming from server, while testing for dummy datas i was not getting any issues and it was working properly. In production, because of some server issue the minDate was getting higher than the maxDate. – Rajeev Shetty Apr 30 '19 at 08:55

2 Answers2

14

Issue was the minDate was higher than the maxDate in some random cases because of some server issues.I was not handling the scenario thinking the minDate(What i was getting) will always be lesser than the System.currentTimeMillis(). So need to handle the scenario :

            if(System.currentTimeMillis() > minCal.getTimeInMillis()){
                dialog.getDatePicker().setMinDate(minCal.getTimeInMillis());
                dialog.getDatePicker().setMaxDate(System.currentTimeMillis());
                dialog.getDatePicker().setCalendarViewShown(false);
                dialog.show();
            }else{

                //Error message depending on the requirements.

            }

Rajeev Shetty
  • 1,534
  • 1
  • 17
  • 27
1

I had a similar issue, with a similar solution.

  • My maxDate was set to Long.MAX_VALUE, which crashes the calendar widget upon opening it
  • Setting maxDate to "1000 years from now" instead of Long.MAX_VALUE fixes it.
Eric
  • 16,397
  • 8
  • 68
  • 76