material-components / material-components-android

Modular and customizable Material Design UI components for Android
Apache License 2.0
16.28k stars 3.06k forks source link

[MaterialCalendarGridView] NullPointerException in onDraw #1338

Closed tipa closed 4 years ago

tipa commented 4 years ago

Description: MaterialDatePicker crashes when using setSelection and MaterialCalendar as materialCalendarFullscreenTheme. The crash happens when swiping to the left after the dialog shows up.

Source code:

<item name="materialCalendarFullscreenTheme">@style/ThemeOverlay.MaterialComponents.MaterialCalendar</item>
MaterialDatePicker.Builder.dateRangePicker()
    .setSelection(new Pair(1485129600000l, 1590537600000l))
    .build()
    .show(getSupportFragmentManager(), "...");

Expected behavior: no crash

Android API version: 29

Material Library version: 1.2.0-alpha06

Device: Device on which the bug was encountered here Galaxy A10 Pixel 2 P10 lite OnePlus 7 Pro


 java.lang.NullPointerException: Attempt to invoke virtual method 'int android.view.View.getRight()' on a null object reference
        at com.google.android.material.datepicker.MaterialCalendarGridView.onDraw(MaterialCalendarGridView.java:158)
        at android.view.View.draw(View.java:21609)
        at android.widget.AbsListView.draw(AbsListView.java:4514)
        at android.view.View.updateDisplayListIfDirty(View.java:20471)
        at android.view.View.draw(View.java:21336)
        at android.view.ViewGroup.drawChild(ViewGroup.java:4413)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4174)
        at android.view.View.updateDisplayListIfDirty(View.java:20462)
        at android.view.View.draw(View.java:21336)
        at android.view.ViewGroup.drawChild(ViewGroup.java:4413)
        at androidx.recyclerview.widget.RecyclerView.drawChild(RecyclerView.java:5030)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4174)
        at android.view.View.draw(View.java:21612)
        at androidx.recyclerview.widget.RecyclerView.draw(RecyclerView.java:4429)
        at android.view.View.updateDisplayListIfDirty(View.java:20471)
        at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4397)
        at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4370)
        at android.view.View.updateDisplayListIfDirty(View.java:20431)
        at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4397)
        at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4370)
        at android.view.View.updateDisplayListIfDirty(View.java:20431)
        at android.view.View.draw(View.java:21336)
        at android.view.ViewGroup.drawChild(ViewGroup.java:4413)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4174)
        at android.view.View.updateDisplayListIfDirty(View.java:20462)
        at android.view.View.draw(View.java:21336)
        at android.view.ViewGroup.drawChild(ViewGroup.java:4413)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4174)
        at android.view.View.updateDisplayListIfDirty(View.java:20462)
        at android.view.View.draw(View.java:21336)
        at android.view.ViewGroup.drawChild(ViewGroup.java:4413)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4174)
        at android.view.View.updateDisplayListIfDirty(View.java:20462)
        at android.view.View.draw(View.java:21336)
        at android.view.ViewGroup.drawChild(ViewGroup.java:4413)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4174)
        at android.view.View.updateDisplayListIfDirty(View.java:20462)
        at android.view.View.draw(View.java:21336)
        at android.view.ViewGroup.drawChild(ViewGroup.java:4413)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4174)
        at android.view.View.updateDisplayListIfDirty(View.java:20462)
        at android.view.View.draw(View.java:21336)
        at android.view.ViewGroup.drawChild(ViewGroup.java:4413)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4174)
        at android.view.View.updateDisplayListIfDirty(View.java:20462)
        at android.view.View.draw(View.java:21336)
        at android.view.ViewGroup.drawChild(ViewGroup.java:4413)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4174)
        at android.view.View.draw(View.java:21612)
        at com.android.internal.policy.DecorView.draw(DecorView.java:815)
        at android.view.View.updateDisplayListIfDirty(View.java:20471)
        at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:580)
        at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:586)
        at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:659)
        at android.view.ViewRootImpl.draw(ViewRootImpl.java:3876)
        at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:3676)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2998)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1935)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:8023)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1163)
        at android.view.Choreographer.doCallbacks(Choreographer.java:986)
        at android.view.Choreographer.doFrame(Choreographer.java:902)```
ph3mmy commented 4 years ago

I just experienced this on the android Emulator with API level 29 as well

Armen101 commented 4 years ago

I have the same issue. Please fix it ASAP

Armen101 commented 4 years ago

I use ''com.google.android.material:material:1.1.0''

Armen101 commented 4 years ago

I also want to add a comment when I open the application with the French language everything is correct, it happens when I use English

mikedirin commented 4 years ago

I see this bug as well. If a date range is set from today to three months later and open the calendar dialog, as soon as swipe to right fast the crash happens. Looks like it happens on 9, was not able to reproduce it on api 23

ryancphil commented 4 years ago

I can reproduce this is 1.3.0-alpha01 as well.

ymarian commented 4 years ago

Should be fixed please try on the latest snapshot

https://github.com/material-components/material-components-android/blob/master/docs/using-snapshot-version.md

SashaCube commented 3 years ago

I'm receiving similar crashes, using version "1.3.0"

I don't have steps to reproduce it, but they occurred on different devices (HUAWEI, Xiaomi, Samsung, OnePlus) with different android versions (10, 9, 8.1, 8.0). Maybe there is a trick with language, most users are using 'fr'.

source:

private fun showDatePicker(from: DateTime, to: DateTime, onSubmit: (DateTime, DateTime) -> Unit) {
        val datePicker = MaterialDatePicker.Builder.dateRangePicker()
        datePicker.setSelection(Pair(from.millis, to.millis))
        val dialog = datePicker.build()
        dialog.addOnPositiveButtonClickListener {
            onSubmit(DateTime(it.first), DateTime(it.second))
        }
        dialog.show(parentFragmentManager, dialog.javaClass.simpleName)
    }

stack trace:

Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.view.View.getLeft()' on a null object reference
       at com.google.android.material.datepicker.MaterialCalendarGridView.horizontalMidPoint(MaterialCalendarGridView.java)
       at com.google.android.material.datepicker.MaterialCalendarGridView.onDraw(MaterialCalendarGridView.java:221)
       at android.view.View.draw(View.java:23187)
       at android.widget.AbsListView.draw(AbsListView.java:7190)
       at android.view.View.updateDisplayListIfDirty(View.java:22062)
       at android.view.View.draw(View.java:22917)
       at android.view.ViewGroup.drawChild(ViewGroup.java:5230)
       at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4987)
       at android.view.View.updateDisplayListIfDirty(View.java:22048)
       at android.view.View.draw(View.java:22917)
       at android.view.ViewGroup.drawChild(ViewGroup.java:5230)
       at androidx.recyclerview.widget.RecyclerView.drawChild(RecyclerView.java)
       at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4987)
       at android.view.View.draw(View.java:23190)
       at androidx.recyclerview.widget.RecyclerView.draw(RecyclerView.java)
       at android.view.View.updateDisplayListIfDirty(View.java:22062)
       at android.view.View.draw(View.java:22917)
       at android.view.ViewGroup.drawChild(ViewGroup.java:5230)
       at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4987)
       at android.view.View.updateDisplayListIfDirty(View.java:22048)
       at android.view.View.draw(View.java:22917)
       at android.view.ViewGroup.drawChild(ViewGroup.java:5230)
       at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4987)
       at android.view.View.updateDisplayListIfDirty(View.java:22048)
       at android.view.View.draw(View.java:22917)
       at android.view.ViewGroup.drawChild(ViewGroup.java:5230)
       at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4987)
       at android.view.View.updateDisplayListIfDirty(View.java:22048)
       at android.view.View.draw(View.java:22917)
       at android.view.ViewGroup.drawChild(ViewGroup.java:5230)
       at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4987)
       at android.view.View.updateDisplayListIfDirty(View.java:22048)
       at android.view.View.draw(View.java:22917)
       at android.view.ViewGroup.drawChild(ViewGroup.java:5230)
       at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4987)
       at android.view.View.updateDisplayListIfDirty(View.java:22048)
       at android.view.View.draw(View.java:22917)
       at android.view.ViewGroup.drawChild(ViewGroup.java:5230)
       at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4987)
       at android.view.View.updateDisplayListIfDirty(View.java:22048)
       at android.view.View.draw(View.java:22917)
       at android.view.ViewGroup.drawChild(ViewGroup.java:5230)
       at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4987)
       at android.view.View.updateDisplayListIfDirty(View.java:22048)
       at android.view.View.draw(View.java:22917)
       at android.view.ViewGroup.drawChild(ViewGroup.java:5230)
       at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4987)
       at android.view.View.updateDisplayListIfDirty(View.java:22048)
       at android.view.View.draw(View.java:22917)
       at android.view.ViewGroup.drawChild(ViewGroup.java:5230)
       at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4987)
       at android.view.View.draw(View.java:23190)
       at com.android.internal.policy.DecorView.draw(DecorView.java:1154)
       at android.view.View.updateDisplayListIfDirty(View.java:22062)
       at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:588)
       at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:594)
       at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:667)
       at android.view.ViewRootImpl.draw(ViewRootImpl.java:4296)
       at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:4080)
       at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3348)
       at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2225)