{"record":{"id":"d308099ba42ef82c","repo":"material-components/material-components-android","slug":"demo-must-implement-createfragment-or-createactivi-d30809","errorCode":null,"errorMessage":"Demo must implement createFragment or createActivityIntent","messagePattern":"Demo must implement createFragment or createActivityIntent","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"catalog/java/io/material/catalog/feature/DemoLandingFragment.java","lineNumber":225,"sourceCode":"  }\n\n  private void startDemo(@NonNull Demo demo) {\n    startDemo(demo, null, null);\n  }\n\n  private void startDemo(\n      @NonNull Demo demo, @Nullable View sharedElement, @Nullable String transitionName) {\n    Fragment fragment = demo.createFragment();\n    if (fragment != null) {\n      startDemoFragment(fragment, sharedElement, transitionName);\n      return;\n    }\n    Intent activityIntent = demo.createActivityIntent();\n    if (activityIntent != null) {\n      startDemoActivity(activityIntent, sharedElement, transitionName);\n      return;\n    }\n    throw new IllegalStateException(\"Demo must implement createFragment or createActivityIntent\");\n  }\n\n  private void startDemoFragment(\n      Fragment fragment, @Nullable View sharedElement, @Nullable String transitionName) {\n    Bundle args = new Bundle();\n    args.putString(DemoFragment.ARG_DEMO_TITLE, getString(getTitleResId()));\n    args.putString(FeatureDemoUtils.ARG_TRANSITION_NAME, transitionName);\n    fragment.setArguments(args);\n    FeatureDemoUtils.startFragment(\n        getActivity(), fragment, FRAGMENT_DEMO_CONTENT, sharedElement, transitionName);\n  }\n\n  private void startDemoActivity(\n      Intent intent, @Nullable View sharedElement, @Nullable String transitionName) {\n    intent.putExtra(DemoActivity.EXTRA_DEMO_TITLE, getString(getTitleResId()));\n\n    if (sharedElement != null && transitionName != null) {\n      intent.putExtra(DemoActivity.EXTRA_TRANSITION_NAME, transitionName);","sourceCodeStart":207,"sourceCodeEnd":243,"githubUrl":"https://github.com/material-components/material-components-android/blob/ac7e18efeefb331850c561faf9ab8bf81d27ba68/catalog/java/io/material/catalog/feature/DemoLandingFragment.java#L207-L243","documentation":"DemoLandingFragment.startDemo(Demo, View, String) launches a demo by first calling demo.createFragment() and then demo.createActivityIntent(). If both return null the demo cannot be started and an IllegalStateException is thrown — the same contract as Demo.getDemoClassName(): every Demo must implement at least one factory method.","triggerScenarios":"Registering a Demo subclass that implements neither createFragment() nor createActivityIntent(), then tapping its entry in the demo landing list so startDemo is invoked.","commonSituations":"Adding a new demo to a landing screen but leaving the Demo object empty; returning null from createFragment() conditionally; merging demos and dropping an override during the merge.","solutions":["Implement createFragment() in the Demo being launched, returning its Fragment.","Or implement createActivityIntent() returning an Intent to the demo Activity.","Verify the demo entry wired into the landing fragment's list is the Demo class you actually implemented."],"exampleFix":"// before\nnew Demo(R.string.my_demo_title, R.drawable.my_demo_icon) {} // no factory\n\n// after\nnew Demo(R.string.my_demo_title, R.drawable.my_demo_icon) {\n  @Override\n  public Fragment createFragment() {\n    return new MyDemoFragment();\n  }\n}","handlingStrategy":"validation","validationCode":"Fragment f = demo.createFragment();\nIntent i = (f == null) ? demo.createActivityIntent() : null;\nif (f != null || i != null) {\n  // safe to start\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Validate demos when building the landing list (fail fast at registration).","Cover each demo with a UI test that taps its entry once."],"tags":["catalog-demo","navigation","illegal-state","configuration"],"backgroundTag":null,"analyzedSha":"ac7e18efeefb331850c561faf9ab8bf81d27ba68","analyzedAt":"2026-08-14T15:35:35.735Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}