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
- 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
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
- Implement ImmersionOwner in a shared base Fragment
- Extend ImmersionFragment/SimpleImmersionFragment from the library
- Check instanceof before constructing the proxy
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
- Fragment请实现SimpleImmersionOwner接口
- Fragment must be attached to an Activity.
- Owner must be attached to a Window.
- View参数不能为空
- tag不能为空
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)