Android应用重写样式后最小化再打开崩溃,报lessonsContainer找不到错误
根因定位
该报错属于Activity重建场景下的Fragment恢复异常,完全匹配你提到的切后台恢复触发的特征:
安卓系统会在应用后台内存不足时销毁Activity,返回前台时自动重建Activity,同时FragmentManager会尝试恢复销毁前添加的所有Fragment实例。你调整样式时修改了布局层级/加载顺序,导致FragmentManager恢复LessonsNewWordsFragment时,承载它的lessonsContainer容器还没有被加载到View树中,就会抛出找不到View的异常。
修复方案
按优先级逐一验证:
修正嵌套Fragment的管理器调用
你当前在LessonsNewWordsFragment中添加内部子Fragment(SoundAndTranslationFragment、LessonCardsFragment等)时,调用的是replaceFragment方法,该方法使用的是父级fragmentManager,但嵌套在Fragment内部的子Fragment必须使用childFragmentManager才能保证生命周期同步,重建时不会出现找不到容器的问题。
将LessonsNewWordsFragment中的两处replaceFragment调用替换为replaceFragmentChild即可:// initViews中默认加载第一个子Fragment replaceFragmentChild(R.id.lessonsNewWordsContainer, rvAdapterSubTasks.getItem(0).fragment, null) // onItemClick中切换子Fragment replaceFragmentChild(R.id.lessonsNewWordsContainer, fragment, null)清除重建时的自动Fragment恢复
在承载LessonsNewWordsFragment的Activity的onCreate方法中,调用super.onCreate之前清空保存的Fragment状态,避免系统自动恢复未初始化的Fragment:override fun onCreate(savedInstanceState: Bundle?) { savedInstanceState?.remove("android:support:fragments") super.onCreate(savedInstanceState) // 原有逻辑不变 }如果你使用的是AndroidX库,对应的key为
"androidx.lifecycle.BundlableSavedStateRegistry.key"。校验布局加载逻辑
确认你样式调整过程中没有修改lessonsContainer所属的布局文件,也没有调整承载LessonsNewWordsFragment的父布局的初始化时机,保证lessonsContainer在添加LessonsNewWordsFragment前已经完成加载。
内容的提问来源于stack exchange,提问作者beles

