Tencent/QMUI_Android · error · IllegalStateException

ViewPager with adapter %s requires a view id

Error message

ViewPager with adapter %s requires a view id

What it means

ViewPager's PagerAdapter contract requires the container view to have a valid id so pages can be restored and matched by id. QMUIFragmentPagerAdapter.startUpdate() validates this up front and throws IllegalStateException when container.getId() == View.NO_ID, since fragment pages attached to an id-less ViewPager cannot be managed correctly across configuration changes.

Source

Thrown at arch/src/main/java/com/qmuiteam/qmui/arch/QMUIFragmentPagerAdapter.java:102

    }

    @SuppressLint("CommitTransaction")
    @Override
    protected void destroy(@NonNull ViewGroup container, int position, @NonNull Object object) {
        Fragment fragment = (Fragment) object;
        if (mCurrentTransaction == null) {
            mCurrentTransaction = mFragmentManager.beginTransaction();
        }
        mCurrentTransaction.detach(fragment);
        if (fragment == mCurrentPrimaryItem) {
            mCurrentPrimaryItem = null;
        }
    }

    @Override
    public void startUpdate(@NonNull ViewGroup container) {
        if (container.getId() == View.NO_ID) {
            throw new IllegalStateException("ViewPager with adapter " + this
                    + " requires a view id");
        }
    }

    @Override
    public void finishUpdate(@NonNull ViewGroup container) {
        if (mCurrentTransaction != null) {
            mCurrentTransaction.commitNowAllowingStateLoss();
            mCurrentTransaction = null;
        }
    }

    @Override
    public void setPrimaryItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
        Fragment fragment = (Fragment) object;
        if (fragment != mCurrentPrimaryItem) {
            if (mCurrentPrimaryItem != null) {
                mCurrentPrimaryItem.setMenuVisibility(false);

View on GitHub (pinned to 026e7d4866)

Solutions

  1. Give the ViewPager an id: android:id="@+id/view_pager" in the layout XML.
  2. If created in code, call viewPager.setId(R.id.view_pager) before setAdapter().
  3. Use View.generateViewId() when no fixed resource id is desired.
  4. Ensure the adapter is set only after the container has a valid id.

Example fix

// before
ViewPager vp = new ViewPager(context);
vp.setAdapter(new QMUIFragmentPagerAdapter(fm));
// after
ViewPager vp = new ViewPager(context);
vp.setId(R.id.view_pager);
vp.setAdapter(new QMUIFragmentPagerAdapter(fm));
Defensive patterns

Strategy: validation

Validate before calling

if (viewPager.getId() == View.NO_ID) {
    viewPager.setId(View.generateViewId());
}
viewPager.setAdapter(adapter);

Type guard

boolean hasViewId(View v) { return v.getId() != View.NO_ID; }

Try / catch

try {
    viewPager.setAdapter(adapter);
} catch (IllegalStateException e) {
    if (e.getMessage() != null && e.getMessage().contains("requires a view id")) {
        viewPager.setId(View.generateViewId());
        viewPager.setAdapter(adapter);
    } else throw e;
}

Prevention

When it happens

Trigger: Adding a ViewPager (or ViewPager2-compat pager) to a layout without android:id, or instantiating the ViewPager programmatically without setId(), then setting a QMUIFragmentPagerAdapter and letting the pager start an update pass.

Common situations: Programmatically created ViewPager missing setId(), XML layouts that omit android:id, dynamic view construction in dialogs/popups, and layouts refactored where the id was dropped.

Understand the failure class

Background: "missing required argument" and "the following required arguments were not provided": what required-argument errors mean and how to fix them — this error's family across 20 libraries.

Related errors


AI-assisted analysis of Tencent/QMUI_Android@026e7d4866 (2026-09-06). Data as JSON: /api/errors/4ec70c57000629c4. Report an issue: GitHub.