[BottomSheetBehavior] ArrayIndexOutOfBoundsException onLayoutChild()

Author: kmayoralCreated Jul 11, 2023Updated Jul 24, 2026
LabelsbugWidget: BottomSheet

https://github.com/material-components/material-components-android/blob/64b066a0c46e78f2c41403dd566fbc1ce8125b66/lib/java/com/google/android/material/bottomsheet/BottomSheetBehavior.java#L612C1-L612C1

I'm getting the following stack trace in production builds, coming out to around 300-400 instances per month.

Fatal Exception: java.lang.ArrayIndexOutOfBoundsException: length=15; index=15
       at java.util.ArrayList.get(ArrayList.java:439)
       at com.google.android.material.bottomsheet.BottomSheetBehavior.onLayoutChild(BottomSheetBehavior.java:590)
       at androidx.coordinatorlayout.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:918)
       at android.view.View.layout(View.java:23411)
       at android.view.ViewGroup.layout(ViewGroup.java:6534)
       at androidx.drawerlayout.widget.DrawerLayout.onLayout(DrawerLayout.java:1263)
       at android.view.View.layout(View.java:23411)
       at android.view.ViewGroup.layout(ViewGroup.java:6534)
       at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
       at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
       at android.view.View.layout(View.java:23411)
       at android.view.ViewGroup.layout(ViewGroup.java:6534)
       at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1829)
       at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1673)
       at android.widget.LinearLayout.onLayout(LinearLayout.java:1582)
       at android.view.View.layout(View.java:23411)
       at android.view.ViewGroup.layout(ViewGroup.java:6534)
       at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
       at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
       at android.view.View.layout(View.java:23411)
       at android.view.ViewGroup.layout(ViewGroup.java:6534)
       at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1829)
       at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1673)
       at android.widget.LinearLayout.onLayout(LinearLayout.java:1582)
       at android.view.View.layout(View.java:23411)
       at android.view.ViewGroup.layout(ViewGroup.java:6534)
       at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
       at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
       at com.android.internal.policy.DecorView.onLayout(DecorView.java:804)
       at android.view.View.layout(View.java:23411)
       at android.view.ViewGroup.layout(ViewGroup.java:6534)
       at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:3714)
       at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3172)
       at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2141)
       at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:8647)
       at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1034)
       at android.view.Choreographer.doCallbacks(Choreographer.java:858)
       at android.view.Choreographer.doFrame(Choreographer.java:789)
       at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1019)
       at android.os.Handler.handleCallback(Handler.java:938)
       at android.os.Handler.dispatchMessage(Handler.java:99)
       at android.os.Looper.loop(Looper.java:236)
       at android.app.ActivityThread.main(ActivityThread.java:8097)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:620)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1011)

It looks like there might be a race condition where the size of the callbacks array is reduced while iterating through the list.

Source: material-components/material-components-android