Search code examples
androidandroid-recyclerviewruntime-errorandroid-drawableandroid-vectordrawable

StackOverflowError on KitKat because of vector drawables


I have a custom view with the following view hierarchy:

[LinearLayout]
  [CardView]
    [LinearLayout]
      [RecyclerView]

Each item of this last RecyclerView contains 3 vector drawables. When i run the app on KitKat (api 19), a StackOverflowError happens

FATAL EXCEPTION: main
     Process: com.tsse.spain.myvodafone, PID: 3405
     java.lang.StackOverflowError
         at android.graphics.Matrix.mapVectors(Matrix.java:684)
         at android.support.graphics.drawable.VectorDrawableCompat$VPathRenderer.getMatrixScale(VectorDrawableCompat.java:1300)
         at android.support.graphics.drawable.VectorDrawableCompat$VPathRenderer.drawPath(VectorDrawableCompat.java:1207)
         at android.support.graphics.drawable.VectorDrawableCompat$VPathRenderer.drawGroupTree(VectorDrawableCompat.java:1184)
         at android.support.graphics.drawable.VectorDrawableCompat$VPathRenderer.draw(VectorDrawableCompat.java:1193)
         at android.support.graphics.drawable.VectorDrawableCompat$VectorDrawableCompatState.updateCachedBitmap(VectorDrawableCompat.java:1023)
         at android.support.graphics.drawable.VectorDrawableCompat.draw(VectorDrawableCompat.java:366)
         at android.view.View.draw(View.java:14450)
         at android.view.View.getDisplayList(View.java:13362)
         at android.view.View.getDisplayList(View.java:13404)
         at android.view.View.draw(View.java:14182)
         at android.view.ViewGroup.drawChild(ViewGroup.java:3103)
         at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)
         at android.view.View.draw(View.java:14468)
         at android.view.View.getDisplayList(View.java:13362)
         at android.view.View.getDisplayList(View.java:13404)
         at android.view.View.draw(View.java:14182)
         at android.view.ViewGroup.drawChild(ViewGroup.java:3103)
         at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)
         at android.view.View.getDisplayList(View.java:13357)
         at android.view.View.getDisplayList(View.java:13404)
         at android.view.View.draw(View.java:14182)
         at android.view.ViewGroup.drawChild(ViewGroup.java:3103)
         at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)
         at android.view.View.getDisplayList(View.java:13357)
         at android.view.View.getDisplayList(View.java:13404)
         at android.view.View.draw(View.java:14182)
         at android.view.ViewGroup.drawChild(ViewGroup.java:3103)
         at android.support.v7.widget.RecyclerView.drawChild(RecyclerView.java:4477)
         at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)
         at android.view.View.draw(View.java:14468)
         at android.support.v7.widget.RecyclerView.draw(RecyclerView.java:3869)
         at android.view.View.getDisplayList(View.java:13362)
         at android.view.View.getDisplayList(View.java:13404)
         at android.view.View.draw(View.java:14182)
         at android.view.ViewGroup.drawChild(ViewGroup.java:3103)
         at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)
         at android.view.View.getDisplayList(View.java:13357)
         at android.view.View.getDisplayList(View.java:13404)
         at android.view.View.draw(View.java:14182)
         at android.view.ViewGroup.drawChild(ViewGroup.java:3103)
         at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)
         at android.view.View.draw(View.java:14468)
         at android.widget.FrameLayout.draw(FrameLayout.java:472)
         at android.view.View.getDisplayList(View.java:13362)
         at android.view.View.getDisplayList(View.java:13404)
         at android.view.View.draw(View.java:14182)
         at android.view.ViewGroup.drawChild(ViewGroup.java:3103)
         at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)
         at android.view.View.draw(View.java:14468)
         at android.view.View.getDisplayList(View.java:13362)
         at android.view.View.getDisplayList(View.java:13404)
         at android.view.View.draw(View.java:14182)
         at android.view.ViewGroup.drawChild(ViewGroup.java:3103)
         at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)
         at android.view.View.getDisplayList(View.java:13357)
         at android.view.View.getDisplayList(View.java:13404)
         at android.view.View.draw(View.java:14182)
         at android.view.ViewGroup.drawChild(ViewGroup.java:3103)
         at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)
         at android.view.View.getDisplayList(View.java:13357)
         at android.view.View.getDisplayList(View.java:13404)
         at android.view.View.draw(View.java:14182)
         at android.view.ViewGroup.drawChild(ViewGroup.java:3103)
         at android.support.v7.widget.RecyclerView.drawChild(RecyclerView.java:4477)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940

I'm enabling vector drawables with AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); in the Application class's onCreate() and vectorDrawables.useSupportLibrary = true in build.gradle

When i use normal PNG drawables the error doesn't happen.

What am i doing wrong?


Solution

  • I solved this issue by converting the vector drawable to a Bitmap first, then give it to the ImageView using ImageView.setImageBitmap(Bitmap). This is less performant, but gets the job done