切换主题后registerForActivityResult为空,Fragment跳转功能失效求助
问题分析与解决方案
问题根源
主题切换属于Android的配置变更,会触发Fragment所在Activity的销毁与重建。你直接在成员变量位置初始化resultLauncher的方式,在Fragment重建时可能出现注册时机不安全的问题,导致新实例的resultLauncher无法正确关联结果回调,表现为功能失效。
修复步骤
- 调整
resultLauncher的注册时机
将resultLauncher改为延迟初始化,在Fragment的生命周期安全方法(如onViewCreated)中注册,确保每次重建都能正确初始化:
private lateinit var resultLauncher: ActivityResultLauncher<Intent> override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == Activity.RESULT_OK) { startGame() } } // 其他视图初始化逻辑 }
- 确保Fragment实例在配置变更后正确保留
在宿主Activity的onCreate方法中,避免重复创建Fragment实例,防止旧实例接收结果回调:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 仅在首次创建Activity时添加Fragment if (savedInstanceState == null) { supportFragmentManager.beginTransaction() .add(R.id.fragment_container, YourTargetFragment()) .commit() } }
- 验证启动逻辑
调用resultLauncher.launch(intent)的代码无需修改,Activity Result API会自动处理配置变更后的结果回调关联,只要resultLauncher是在生命周期内正确注册的,就能正常接收返回结果。
额外说明
AppPreferences.hasSeenGameInstructions的状态保存不受配置变更影响(只要是持久化存储),无需额外处理。核心问题还是resultLauncher的注册时机与Fragment实例重建的匹配问题。
内容的提问来源于stack exchange,提问作者Bardha Korqaj
相关产品推荐
相关产品推荐

