{"record":{"id":"6240832cb190f0a5","repo":"gyf-dev/ImmersionBar","slug":"fragment-immersionowner","errorCode":null,"errorMessage":"Fragment请实现ImmersionOwner接口","messagePattern":"Fragment请实现ImmersionOwner接口","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"immersionbar-components/src/main/java/com/gyf/immersionbar/components/ImmersionProxy.java","lineNumber":42,"sourceCode":"    /**\n     * Fragment的view是否已经初始化完成\n     */\n    private boolean mIsActivityCreated;\n    /**\n     * 懒加载，是否已经在view初始化完成之前调用\n     */\n    private boolean mIsLazyAfterView;\n    /**\n     * 懒加载，是否已经在view初始化完成之后调用\n     */\n    private boolean mIsLazyBeforeView;\n\n    public ImmersionProxy(Fragment fragment) {\n        this.mFragment = fragment;\n        if (fragment instanceof ImmersionOwner) {\n            this.mImmersionOwner = (ImmersionOwner) fragment;\n        } else {\n            throw new IllegalArgumentException(\"Fragment请实现ImmersionOwner接口\");\n        }\n    }\n\n    public void setUserVisibleHint(boolean isVisibleToUser) {\n        if (mFragment != null) {\n            if (mFragment.getUserVisibleHint()) {\n                if (!mIsLazyBeforeView) {\n                    mImmersionOwner.onLazyBeforeView();\n                    mIsLazyBeforeView = true;\n                }\n                if (mIsActivityCreated) {\n                    if (mFragment.getUserVisibleHint()) {\n                        if (mImmersionOwner.immersionBarEnabled()) {\n                            mImmersionOwner.initImmersionBar();\n                        }\n                        if (!mIsLazyAfterView) {\n                            mImmersionOwner.onLazyAfterView();\n                            mIsLazyAfterView = true;","sourceCodeStart":24,"sourceCodeEnd":60,"githubUrl":"https://github.com/gyf-dev/ImmersionBar/blob/8cac10cd83d809eac54f42b37f92340c4a25c4ac/immersionbar-components/src/main/java/com/gyf/immersionbar/components/ImmersionProxy.java#L24-L60","documentation":"ImmersionProxy wraps a Fragment to drive immersion-bar lifecycle callbacks. In its constructor it requires the Fragment to implement the ImmersionOwner interface; otherwise it cannot dispatch immersion callbacks, so it throws IllegalArgumentException immediately at construction time.","triggerScenarios":"Calling new ImmersionProxy(fragment) where the fragment class does not implement ImmersionOwner (which combines ImmersionCallback and ImmersionAdapter).","commonSituations":"Using immersionbar-components with legacy fragments created before the interface existed; copying sample code for the Activity-only immersionbar module but wiring ImmersionProxy into plain Fragments; refactoring that removed the interface from a base Fragment class.","solutions":["Make the Fragment (or its base class) implement ImmersionOwner and override onInitBar/onBarCreate etc.","Extend SimpleImmersionFragment / ImmersionFragment from the components module instead of plain Fragment","If you don't need the proxy contract, use plain ImmersionBar.with(fragment) from the core module instead of ImmersionProxy"],"exampleFix":"// before\npublic class MyFragment extends Fragment {\n    private final ImmersionProxy proxy = new ImmersionProxy(this);\n}\n// after\npublic class MyFragment extends Fragment implements ImmersionOwner {\n    @Override public void onInitBar(ImmersionBar bar) { bar.statusBarDarkFont(true).init(); }\n    private final ImmersionProxy proxy = new ImmersionProxy(this);\n}","handlingStrategy":"validation","validationCode":"if (fragment instanceof ImmersionOwner) { new ImmersionProxy(fragment); } else { /* log or fix */ }","typeGuard":"boolean supportsImmersion(Fragment f) { return f instanceof ImmersionOwner; }","tryCatchPattern":"try { proxy = new ImmersionProxy(fragment); } catch (IllegalArgumentException e) { Log.e(TAG, \"Fragment lacks ImmersionOwner\", e); }","preventionTips":["Implement ImmersionOwner in a shared base Fragment","Extend ImmersionFragment/SimpleImmersionFragment from the library","Check instanceof before constructing the proxy"],"tags":["android","fragment","interface-contract","argument-validation"],"backgroundTag":"invalid-constructor-argument","analyzedSha":"8cac10cd83d809eac54f42b37f92340c4a25c4ac","analyzedAt":"2026-09-08T11:52:01.757Z","contentChangedAt":"2026-09-08T11:52:01.757Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}