迁移至新Splash Screen API后结合Navigation组件跳转崩溃问题求助
问题解决思路
第一个错误:Theme.AppCompat 主题要求
这个报错的核心是二级Activity的主题未继承AppCompat系列主题。新的Splash Screen API仅需在启动页(MainActivity)调用installSplashScreen(),二级Activity不需要调用这个方法,且必须确保其主题继承自Theme.AppCompat或其子类(比如Theme.MaterialComponents.DayNight.NoActionBar这类兼容主题)。
解决步骤:
- 打开
res/values/styles.xml(或对应夜间模式样式文件),为二级Activity定义兼容主题:
<style name="SecondActivityTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- 自定义样式配置,比如隐藏ActionBar等 --> </style>
- 在
AndroidManifest.xml中为二级Activity绑定该主题:
<activity android:name=".SecondActivity" android:theme="@style/SecondActivityTheme" />
- 移除二级Activity中的
installSplashScreen()调用——该方法仅用于启动页,其他Activity调用会引发不必要的主题冲突或生命周期异常。
第二个错误:Fragment 无参构造缺失
报错提示“could not find Fragment constructor”,这是Android Fragment的强制规范:所有Fragment必须提供公共无参构造方法。系统在重建Fragment(如配置变更、内存回收后恢复)时,会通过反射调用无参构造实例化Fragment,若你的Fragment仅存在带参数的构造,就会触发这个异常。
解决步骤:
- 检查报错的
ab.qFragment(对应你代码中的具体Fragment类),确保它有公共无参构造:
class TargetFragment : Fragment() { // 必须保留无参构造,即使是空实现 constructor() : super() // 如需传递参数,不要用带参构造,改用Bundle传递 companion object { fun newInstance(param: String): TargetFragment { val fragment = TargetFragment() val args = Bundle() args.putString("PARAM_KEY", param) fragment.arguments = args return fragment } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 从arguments中取出参数 val param = arguments?.getString("PARAM_KEY") } }
- 确保所有通过Navigation跳转或动态加载的Fragment都遵循该规范,统一用
argumentsBundle传递数据,不要依赖带参构造。
内容的提问来源于stack exchange,提问作者DeKekem
相关产品推荐
相关产品推荐

