{"record":{"id":"7fc16ac30f9cc78a","repo":"Tencent/QMUI_Android","slug":"s-did-not-call-through-to-super-onenteranimatione","errorCode":null,"errorMessage":"%s did not call through to super.onEnterAnimationEnd(Animation)","messagePattern":"(.+?) did not call through to super\\.onEnterAnimationEnd\\(Animation\\)","errorType":"exception","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"arch/src/main/java/com/qmuiteam/qmui/arch/QMUIFragment.java","lineNumber":1148,"sourceCode":"            });\n            return animator;\n        }\n        return super.onCreateAnimator(transit, enter, nextAnim);\n    }\n\n    private void checkAndCallOnEnterAnimationStart(@Nullable Animator animation) {\n        mCalled = false;\n        onEnterAnimationStart(animation);\n        if (!mCalled) {\n            throw new RuntimeException(getClass().getSimpleName() + \" did not call through to super.onEnterAnimationStart(Animation)\");\n        }\n    }\n\n    private void checkAndCallOnEnterAnimationEnd(@Nullable Animator animation) {\n        mCalled = false;\n        onEnterAnimationEnd(animation);\n        if (!mCalled) {\n            throw new RuntimeException(getClass().getSimpleName() + \" did not call through to super.onEnterAnimationEnd(Animation)\");\n        }\n    }\n\n    /**\n     * onCreateView\n     */\n    protected abstract View onCreateView();\n\n\n    /**\n     * Corresponding to {@link #onCreateView()}, it called only when new UI (not cached UI)\n     * is created by {@link #onCreateView()}.\n     * It may be used to bind views to fragment and dynamically create child views such as\n     * {@link QMUITopBar#addLeftBackImageButton()}\n     *\n     * @param rootView the view created by {@link #onCreateView()}\n     */\n    protected void onViewCreated(@NonNull View rootView) {","sourceCodeStart":1130,"sourceCodeEnd":1166,"githubUrl":"https://github.com/Tencent/QMUI_Android/blob/026e7d486677d6593a96689cd590ec3561176717/arch/src/main/java/com/qmuiteam/qmui/arch/QMUIFragment.java#L1130-L1166","documentation":"checkAndCallOnEnterAnimationEnd mirrors the start check: onEnterAnimationEnd must call the super implementation, verified via mCalled; otherwise the library throws to keep animation-end state handling consistent.","triggerScenarios":"Overriding onEnterAnimationEnd(Animator/Animation) without calling super.onEnterAnimationEnd(animation).","commonSituations":"Cleaning up custom animations and forgetting super; overrides written before the contract existed; merge conflicts dropping the super call.","solutions":["Call super.onEnterAnimationEnd(animation) in the override","Place custom cleanup after the super call","Delete the override if it only duplicated default behavior"],"exampleFix":"// before\n@Override\npublic void onEnterAnimationEnd(Animator animation) {\n    cleanup();\n}\n// after\n@Override\npublic void onEnterAnimationEnd(Animator animation) {\n    super.onEnterAnimationEnd(animation);\n    cleanup();\n}","handlingStrategy":"type-guard","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":["Call super in every onEnterAnimationEnd override","Keep custom animation cleanup after the super call","Verify super calls survive refactors and merges"],"tags":["android","override-contract","animation"],"backgroundTag":"super-not-called","analyzedSha":"026e7d486677d6593a96689cd590ec3561176717","analyzedAt":"2026-09-06T13:32:24.816Z","contentChangedAt":"2026-09-06T13:32:24.816Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}