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
- Give the ViewPager an id: android:id="@+id/view_pager" in the layout XML.
- If created in code, call viewPager.setId(R.id.view_pager) before setAdapter().
- Use View.generateViewId() when no fixed resource id is desired.
- 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
- Always give ViewPager an android:id in XML
- Call setId() before setAdapter() for programmatic views
- Check adapters in dialogs/popups where ids are often omitted
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
- must call #configFragmentContainerView() in onCreateView()
- 替换数据不存在
- Can not perform LatestVisitRecord, %s must be annotated by L
- Fragment(%s) not attached to Activity.
- Can not find the fragment container provider.
AI-assisted analysis of Tencent/QMUI_Android@026e7d4866 (2026-09-06).
Data as JSON: /api/errors/4ec70c57000629c4.
Report an issue: GitHub.