{"record":{"id":"cc4f8e9d9ae661d5","repo":"gyf-dev/ImmersionBar","slug":"fragment-simpleimmersionowner","errorCode":null,"errorMessage":"Fragment请实现SimpleImmersionOwner接口","messagePattern":"Fragment请实现SimpleImmersionOwner接口","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"immersionbar-components/src/main/java/com/gyf/immersionbar/components/SimpleImmersionProxy.java","lineNumber":34,"sourceCode":"    /**\n     * 要操作的Fragment对象\n     */\n    private Fragment mFragment;\n    /**\n     * 沉浸式实现接口\n     */\n    private SimpleImmersionOwner mSimpleImmersionOwner;\n    /**\n     * Fragment的view是否已经初始化完成\n     */\n    private boolean mIsActivityCreated;\n\n    public SimpleImmersionProxy(Fragment fragment) {\n        this.mFragment = fragment;\n        if (fragment instanceof SimpleImmersionOwner) {\n            this.mSimpleImmersionOwner = (SimpleImmersionOwner) fragment;\n        } else {\n            throw new IllegalArgumentException(\"Fragment请实现SimpleImmersionOwner接口\");\n        }\n    }\n\n    public void setUserVisibleHint(boolean isVisibleToUser) {\n        setImmersionBar();\n    }\n\n    public void onActivityCreated(@Nullable Bundle savedInstanceState) {\n        mIsActivityCreated = true;\n        setImmersionBar();\n    }\n\n    public void onDestroy() {\n        mFragment = null;\n        mSimpleImmersionOwner = null;\n    }\n\n    public void onConfigurationChanged(Configuration newConfig) {","sourceCodeStart":16,"sourceCodeEnd":52,"githubUrl":"https://github.com/gyf-dev/ImmersionBar/blob/8cac10cd83d809eac54f42b37f92340c4a25c4ac/immersionbar-components/src/main/java/com/gyf/immersionbar/components/SimpleImmersionProxy.java#L16-L52","documentation":"SimpleImmersionProxy is a convenience wrapper that requires its Fragment to implement SimpleImmersionOwner (which only requires onSetBar). The constructor performs an instanceof check and throws IllegalArgumentException when the fragment does not implement it, since there is otherwise nothing to invoke setImmersionBar() on.","triggerScenarios":"Calling new SimpleImmersionProxy(fragment) with a Fragment that implements ImmersionOwner or nothing at all, but not SimpleImmersionOwner.","commonSituations":"Mixing the two proxy flavors: fragment was set up for ImmersionProxy but the developer switched to SimpleImmersionProxy; base class implements ImmersionOwner only; forgetting to implement SimpleImmersionOwner after adding the proxy.","solutions":["Have the Fragment implement SimpleImmersionOwner and override onSetBar(ImmersionBar bar)","Extend SimpleImmersionFragment from the components library","Switch back to ImmersionProxy if the fragment already implements ImmersionOwner"],"exampleFix":"// before\npublic class MyFragment extends Fragment {\n    private final SimpleImmersionProxy proxy = new SimpleImmersionProxy(this);\n}\n// after\npublic class MyFragment extends Fragment implements SimpleImmersionOwner {\n    @Override public void onSetBar(ImmersionBar bar) { bar.statusBarDarkFont(true).init(); }\n    private final SimpleImmersionProxy proxy = new SimpleImmersionProxy(this);\n}","handlingStrategy":"validation","validationCode":"if (fragment instanceof SimpleImmersionOwner) { new SimpleImmersionProxy(fragment); }","typeGuard":"boolean supportsSimpleImmersion(Fragment f) { return f instanceof SimpleImmersionOwner; }","tryCatchPattern":"try { proxy = new SimpleImmersionProxy(fragment); } catch (IllegalArgumentException e) { Log.e(TAG, \"Fragment lacks SimpleImmersionOwner\", e); }","preventionTips":["Keep one proxy flavor per fragment hierarchy; don't mix ImmersionProxy and SimpleImmersionProxy","Implement SimpleImmersionOwner in the base Fragment","Extend SimpleImmersionFragment"],"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"}