gyf-dev/ImmersionBar · error · IllegalArgumentException

Fragment请实现ImmersionOwner接口

Error message

Fragment请实现ImmersionOwner接口

What it means

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.

Solutions

  1. Make the Fragment (or its base class) implement ImmersionOwner and override onInitBar/onBarCreate etc.
  2. Extend SimpleImmersionFragment / ImmersionFragment from the components module instead of plain Fragment
  3. If you don't need the proxy contract, use plain ImmersionBar.with(fragment) from the core module instead of ImmersionProxy

Example fix

// before
public class MyFragment extends Fragment {
    private final ImmersionProxy proxy = new ImmersionProxy(this);
}
// after
public class MyFragment extends Fragment implements ImmersionOwner {
    @Override public void onInitBar(ImmersionBar bar) { bar.statusBarDarkFont(true).init(); }
    private final ImmersionProxy proxy = new ImmersionProxy(this);
}
Defensive patterns

Strategy: validation

Validate before calling

if (fragment instanceof ImmersionOwner) { new ImmersionProxy(fragment); } else { /* log or fix */ }

Type guard

boolean supportsImmersion(Fragment f) { return f instanceof ImmersionOwner; }

Try / catch

try { proxy = new ImmersionProxy(fragment); } catch (IllegalArgumentException e) { Log.e(TAG, "Fragment lacks ImmersionOwner", e); }

Prevention

When it happens

Trigger: Calling new ImmersionProxy(fragment) where the fragment class does not implement ImmersionOwner (which combines ImmersionCallback and ImmersionAdapter).

Common situations: 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.

Related errors


AI-assisted analysis of gyf-dev/ImmersionBar@8cac10cd83 (2026-09-08). Data as JSON: /api/errors/6240832cb190f0a5. Report an issue: GitHub.

Appendix: source

Thrown at immersionbar-components/src/main/java/com/gyf/immersionbar/components/ImmersionProxy.java:42

    /**
     * Fragment的view是否已经初始化完成
     */
    private boolean mIsActivityCreated;
    /**
     * 懒加载,是否已经在view初始化完成之前调用
     */
    private boolean mIsLazyAfterView;
    /**
     * 懒加载,是否已经在view初始化完成之后调用
     */
    private boolean mIsLazyBeforeView;

    public ImmersionProxy(Fragment fragment) {
        this.mFragment = fragment;
        if (fragment instanceof ImmersionOwner) {
            this.mImmersionOwner = (ImmersionOwner) fragment;
        } else {
            throw new IllegalArgumentException("Fragment请实现ImmersionOwner接口");
        }
    }

    public void setUserVisibleHint(boolean isVisibleToUser) {
        if (mFragment != null) {
            if (mFragment.getUserVisibleHint()) {
                if (!mIsLazyBeforeView) {
                    mImmersionOwner.onLazyBeforeView();
                    mIsLazyBeforeView = true;
                }
                if (mIsActivityCreated) {
                    if (mFragment.getUserVisibleHint()) {
                        if (mImmersionOwner.immersionBarEnabled()) {
                            mImmersionOwner.initImmersionBar();
                        }
                        if (!mIsLazyAfterView) {
                            mImmersionOwner.onLazyAfterView();
                            mIsLazyAfterView = true;

View on GitHub (pinned to 8cac10cd83)