{"record":{"id":"4ec70c57000629c4","repo":"Tencent/QMUI_Android","slug":"viewpager-with-adapter-s-requires-a-view-id","errorCode":null,"errorMessage":"ViewPager with adapter %s requires a view id","messagePattern":"ViewPager with adapter (.+?) requires a view id","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"arch/src/main/java/com/qmuiteam/qmui/arch/QMUIFragmentPagerAdapter.java","lineNumber":102,"sourceCode":"    }\n\n    @SuppressLint(\"CommitTransaction\")\n    @Override\n    protected void destroy(@NonNull ViewGroup container, int position, @NonNull Object object) {\n        Fragment fragment = (Fragment) object;\n        if (mCurrentTransaction == null) {\n            mCurrentTransaction = mFragmentManager.beginTransaction();\n        }\n        mCurrentTransaction.detach(fragment);\n        if (fragment == mCurrentPrimaryItem) {\n            mCurrentPrimaryItem = null;\n        }\n    }\n\n    @Override\n    public void startUpdate(@NonNull ViewGroup container) {\n        if (container.getId() == View.NO_ID) {\n            throw new IllegalStateException(\"ViewPager with adapter \" + this\n                    + \" requires a view id\");\n        }\n    }\n\n    @Override\n    public void finishUpdate(@NonNull ViewGroup container) {\n        if (mCurrentTransaction != null) {\n            mCurrentTransaction.commitNowAllowingStateLoss();\n            mCurrentTransaction = null;\n        }\n    }\n\n    @Override\n    public void setPrimaryItem(@NonNull ViewGroup container, int position, @NonNull Object object) {\n        Fragment fragment = (Fragment) object;\n        if (fragment != mCurrentPrimaryItem) {\n            if (mCurrentPrimaryItem != null) {\n                mCurrentPrimaryItem.setMenuVisibility(false);","sourceCodeStart":84,"sourceCodeEnd":120,"githubUrl":"https://github.com/Tencent/QMUI_Android/blob/026e7d486677d6593a96689cd590ec3561176717/arch/src/main/java/com/qmuiteam/qmui/arch/QMUIFragmentPagerAdapter.java#L84-L120","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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."],"exampleFix":"// before\nViewPager vp = new ViewPager(context);\nvp.setAdapter(new QMUIFragmentPagerAdapter(fm));\n// after\nViewPager vp = new ViewPager(context);\nvp.setId(R.id.view_pager);\nvp.setAdapter(new QMUIFragmentPagerAdapter(fm));","handlingStrategy":"validation","validationCode":"if (viewPager.getId() == View.NO_ID) {\n    viewPager.setId(View.generateViewId());\n}\nviewPager.setAdapter(adapter);","typeGuard":"boolean hasViewId(View v) { return v.getId() != View.NO_ID; }","tryCatchPattern":"try {\n    viewPager.setAdapter(adapter);\n} catch (IllegalStateException e) {\n    if (e.getMessage() != null && e.getMessage().contains(\"requires a view id\")) {\n        viewPager.setId(View.generateViewId());\n        viewPager.setAdapter(adapter);\n    } else throw e;\n}","preventionTips":["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"],"tags":["android","viewpager","fragment","adapter"],"backgroundTag":"missing-required-argument","analyzedSha":"026e7d486677d6593a96689cd590ec3561176717","analyzedAt":"2026-09-06T13:32:24.816Z","contentChangedAt":"2026-09-06T13:32:24.816Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}