H07000223/FlycoTabLayout · error · IllegalStateException

ViewPager or ViewPager adapter can not be NULL !

Error message

ViewPager or ViewPager adapter can not be NULL !

What it means

SlidingTabLayout.setViewPager(ViewPager) throws this IllegalStateException when the ViewPager is null or its adapter has not been set yet. The layout reads titles and page count from the ViewPager's adapter, so both must exist before binding.

Solutions

  1. Call vp.setAdapter(adapter) before layout.setViewPager(vp).
  2. Ensure findViewById for the ViewPager returns non-null (correct layout inflated, correct ID).
  3. Reorder initialization: inflate layout, create adapter, set adapter on ViewPager, then bind the tab layout.
  4. Catch IllegalStateException if ViewPager binding is optional/deferred in your flow.

Example fix

// before
slidingTabLayout.setViewPager(viewPager);
viewPager.setAdapter(adapter);
// after
viewPager.setAdapter(adapter);
slidingTabLayout.setViewPager(viewPager);
Defensive patterns

Strategy: validation

Validate before calling

if (viewPager != null && viewPager.getAdapter() != null) {
    slidingTabLayout.setViewPager(viewPager);
}

Type guard

boolean isBindable(ViewPager vp) {
    return vp != null && vp.getAdapter() != null;
}

Try / catch

try {
    slidingTabLayout.setViewPager(viewPager);
} catch (IllegalStateException e) {
    Log.e("SlidingTabLayout", "ViewPager/adapter missing", e);
}

Prevention

When it happens

Trigger: Calling setViewPager(null); calling setViewPager(vp) on a ViewPager whose setAdapter() has not yet been called; calling before the adapter is attached (e.g. in onViewCreated ordering mistakes).

Common situations: Calling setViewPager before setAdapter in an Activity's onCreate/onCreate; ViewPager injected via findViewById returning null due to wrong layout/ID; adapter set later in a fragment lifecycle than the tab binding.

Related errors


AI-assisted analysis of H07000223/FlycoTabLayout@528fcffe88 (2026-09-08). Data as JSON: /api/errors/63a84cabb8eb0061. Report an issue: GitHub.

Appendix: source

Thrown at FlycoTabLayout_Lib/src/main/java/com/flyco/tablayout/SlidingTabLayout.java:175

        mDividerPadding = ta.getDimension(R.styleable.SlidingTabLayout_tl_divider_padding, dp2px(12));

        mTextsize = ta.getDimension(R.styleable.SlidingTabLayout_tl_textsize, sp2px(14));
        mTextSelectColor = ta.getColor(R.styleable.SlidingTabLayout_tl_textSelectColor, Color.parseColor("#ffffff"));
        mTextUnselectColor = ta.getColor(R.styleable.SlidingTabLayout_tl_textUnselectColor, Color.parseColor("#AAffffff"));
        mTextBold = ta.getInt(R.styleable.SlidingTabLayout_tl_textBold, TEXT_BOLD_NONE);
        mTextAllCaps = ta.getBoolean(R.styleable.SlidingTabLayout_tl_textAllCaps, false);

        mTabSpaceEqual = ta.getBoolean(R.styleable.SlidingTabLayout_tl_tab_space_equal, false);
        mTabWidth = ta.getDimension(R.styleable.SlidingTabLayout_tl_tab_width, dp2px(-1));
        mTabPadding = ta.getDimension(R.styleable.SlidingTabLayout_tl_tab_padding, mTabSpaceEqual || mTabWidth > 0 ? dp2px(0) : dp2px(20));

        ta.recycle();
    }

    /** 关联ViewPager */
    public void setViewPager(ViewPager vp) {
        if (vp == null || vp.getAdapter() == null) {
            throw new IllegalStateException("ViewPager or ViewPager adapter can not be NULL !");
        }

        this.mViewPager = vp;

        this.mViewPager.removeOnPageChangeListener(this);
        this.mViewPager.addOnPageChangeListener(this);
        notifyDataSetChanged();
    }

    /** 关联ViewPager,用于不想在ViewPager适配器中设置titles数据的情况 */
    public void setViewPager(ViewPager vp, String[] titles) {
        if (vp == null || vp.getAdapter() == null) {
            throw new IllegalStateException("ViewPager or ViewPager adapter can not be NULL !");
        }

        if (titles == null || titles.length == 0) {
            throw new IllegalStateException("Titles can not be EMPTY !");
        }

View on GitHub (pinned to 528fcffe88)