{"record":{"id":"3ab156086f177c5d","repo":"Tencent/QMUI_Android","slug":"fragment-s-not-attached-to-activity","errorCode":null,"errorMessage":"Fragment(%s) not attached to Activity.","messagePattern":"Fragment\\((.+?)\\) not attached to Activity\\.","errorType":"exception","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"arch/src/main/java/com/qmuiteam/qmui/arch/QMUIFragment.java","lineNumber":315,"sourceCode":"    public final void onLatestVisitArgumentChanged() {\n        if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.INITIALIZED) && sLatestVisitFragmentUUid == mUUid) {\n            checkLatestVisitRecord();\n        }\n    }\n\n    @Override\n    public void onCollectLatestVisitArgument(RecordArgumentEditor editor) {\n\n    }\n\n\n    @Nullable\n    public <T extends Effect> QMUIFragmentEffectRegistration registerEffect(\n            @NonNull final LifecycleOwner lifecycleOwner,\n            @NonNull final QMUIFragmentEffectHandler<T> effectHandler) {\n        FragmentActivity activity = getActivity();\n        if (activity == null) {\n            throw new RuntimeException(\"Fragment(\" + getClass().getSimpleName() + \") not attached to Activity.\");\n        }\n        ensureFragmentEffectRegistry();\n        return mFragmentEffectRegistry.register(lifecycleOwner, effectHandler);\n    }\n\n    public <T extends Effect> void notifyEffect(T effect) {\n        FragmentActivity activity = getActivity();\n        if (activity == null) {\n            QMUILog.d(TAG, \"Fragment(\" + getClass().getSimpleName() + \") not attached to Activity.\");\n            return;\n        }\n        ensureFragmentEffectRegistry();\n        mFragmentEffectRegistry.notifyEffect(effect);\n    }\n\n    private void ensureFragmentEffectRegistry() {\n        if (mFragmentEffectRegistry == null) {\n            QMUIFragmentContainerProvider provider = findFragmentContainerProvider(false);","sourceCodeStart":297,"sourceCodeEnd":333,"githubUrl":"https://github.com/Tencent/QMUI_Android/blob/026e7d486677d6593a96689cd590ec3561176717/arch/src/main/java/com/qmuiteam/qmui/arch/QMUIFragment.java#L297-L333","documentation":"registerEffect requires the fragment to be attached to an Activity because the effect registry is tied to the activity context. If getActivity() returns null the library throws rather than silently dropping the registration.","triggerScenarios":"Calling registerEffect(...) before onAttach completes (e.g. in the fragment constructor or onCreate before attachment) or after onDetach.","commonSituations":"Registering effects in field initializers or constructors; registering in onActivityCreated timing assumptions broken by lifecycle changes; registering after detach during config changes.","solutions":["Move registerEffect calls into onAttach or later lifecycle callbacks (onViewCreated/onResume)","Check isAdded()/getActivity() != null before calling","Re-register in onViewCreated instead of constructor or field initializer"],"exampleFix":"// before\nprivate QMUIFragmentEffectRegistration reg = registerEffect(this, handler);\n// after\n@Override\npublic void onViewCreated(View view, Bundle savedInstanceState) {\n    reg = registerEffect(this, handler);\n}","handlingStrategy":"validation","validationCode":"if (isAdded() && getActivity() != null) { registerEffect(this, handler); }","typeGuard":"boolean canRegisterEffect(Fragment f) { return f.isAdded() && f.getActivity() != null; }","tryCatchPattern":"try { registerEffect(this, handler); } catch (RuntimeException e) { if (e.getMessage() != null && e.getMessage().contains(\"not attached\")) { /* defer to onViewCreated */ } else { throw e; } }","preventionTips":["Never call registerEffect from constructors or field initializers","Register effects in onAttach/onViewCreated, unregister in onDetach/onDestroyView","Guard async callbacks with isAdded()"],"tags":["android","fragment-lifecycle"],"backgroundTag":"fragment-not-attached","analyzedSha":"026e7d486677d6593a96689cd590ec3561176717","analyzedAt":"2026-09-06T13:32:24.816Z","contentChangedAt":"2026-09-06T13:32:24.816Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}