{"record":{"id":"5207ff5bb30c8bac","repo":"ybq/Android-SpinKit","slug":"this-d-must-be-instanceof-sprite","errorCode":null,"errorMessage":"this d must be instanceof Sprite","messagePattern":"this d must be instanceof Sprite","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"library/src/main/java/com/github/ybq/android/spinkit/SpinKitView.java","lineNumber":57,"sourceCode":"        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SpinKitView, defStyleAttr,\n                defStyleRes);\n        mStyle = Style.values()[a.getInt(R.styleable.SpinKitView_SpinKit_Style, 0)];\n        mColor = a.getColor(R.styleable.SpinKitView_SpinKit_Color, Color.WHITE);\n        a.recycle();\n        init();\n        setIndeterminate(true);\n    }\n\n    private void init() {\n        Sprite sprite = SpriteFactory.create(mStyle);\n        sprite.setColor(mColor);\n        setIndeterminateDrawable(sprite);\n    }\n\n    @Override\n    public void setIndeterminateDrawable(Drawable d) {\n        if (!(d instanceof Sprite)) {\n            throw new IllegalArgumentException(\"this d must be instanceof Sprite\");\n        }\n        setIndeterminateDrawable((Sprite) d);\n    }\n\n    public void setIndeterminateDrawable(Sprite d) {\n        super.setIndeterminateDrawable(d);\n        mSprite = d;\n        if (mSprite.getColor() == 0) {\n\n            mSprite.setColor(mColor);\n        }\n        onSizeChanged(getWidth(), getHeight(), getWidth(), getHeight());\n        if (getVisibility() == VISIBLE) {\n\n            mSprite.start();\n        }\n    }\n","sourceCodeStart":39,"sourceCodeEnd":75,"githubUrl":"https://github.com/ybq/Android-SpinKit/blob/aa83e4d0a42c76eae15e8b18b79aa2a231cca5f8/library/src/main/java/com/github/ybq/android/spinkit/SpinKitView.java#L39-L75","documentation":"SpinKitView only accepts drawables that are instances of the library's own Sprite abstract class. The framework's setIndeterminateDrawable(Drawable) is overridden and throws IllegalArgumentException when passed any other Drawable, because the spinner's animation logic works exclusively on Sprite objects.","triggerScenarios":"Calling setIndeterminateDrawable() (or init via constructor) on a SpinKitView with a Drawable that is not a Sprite subclass, e.g. a ColorDrawable, GradientDrawable, or a drawable inflated from XML via getDrawable().","commonSituations":"Developers inflate a spinner drawable from XML resources (which returns a plain Drawable), or pass system drawables instead of using SpinKitView's built-in Sprite styles such as Wave, RotatingPlane, or ChasingDots.","solutions":["Pass a Sprite instance: new SpinKitView.Builder(context).setStyle(Style.WAVE).build(), or use SpriteFactory to create one","If loading from XML, ensure the drawable declared is one of the library's Sprite classes, and cast/verify it before calling setIndeterminateDrawable","If you need a custom drawable, subclass Sprite (or DoubleClickListener-free SpriteDrawable) instead of a plain Drawable","Guard with instanceof before calling, and fall back to SpriteFactory.create() on non-Sprite drawables"],"exampleFix":"// before\nspinKitView.setIndeterminateDrawable(ContextCompat.getDrawable(context, R.drawable.custom_loader));\n// after\nSprite sprite = SpriteFactory.create(context, Style.WAVE);\nspinKitView.setIndeterminateDrawable(sprite);","handlingStrategy":"type-guard","validationCode":"if (drawable instanceof Sprite) { view.setIndeterminateDrawable(drawable); } else { view.setIndeterminateDrawable(SpriteFactory.create(context, Style.WAVE)); }","typeGuard":"boolean isSpriteDrawable(Drawable d) { return d instanceof Sprite; }","tryCatchPattern":"try { view.setIndeterminateDrawable(drawable); } catch (IllegalArgumentException e) { view.setIndeterminateDrawable(SpriteFactory.create(context, Style.WAVE)); }","preventionTips":["Always create spinner drawables via SpriteFactory or the SpinKitView.Builder style API","Never pass drawables inflated from XML unless they are confirmed Sprite subclasses","Add an instanceof assertion in your own wrapper around setIndeterminateDrawable"],"tags":["android","illegal-argument","drawable","type-mismatch"],"backgroundTag":"invalid-argument-value","analyzedSha":"aa83e4d0a42c76eae15e8b18b79aa2a231cca5f8","analyzedAt":"2026-09-12T17:13:52.255Z","contentChangedAt":"2026-09-12T17:13:52.255Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}