Activity向Fragment传数据时onActivityResult方法已过时,求非过时实现方案
替代过时的Fragment.onActivityResult方法的解决方案
Google已弃用Fragment.onActivityResult()方法,现在推荐使用Activity Result API处理Activity返回结果,以下是两种可行的实现方式:
一、Fragment直接处理Activity返回结果(推荐)
让Fragment自行注册结果回调,无需Activity中转,结果会直接回调到Fragment内部,代码更简洁解耦:
class MyFragment : Fragment() { // 注册Activity结果回调 private val activityResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == Activity.RESULT_OK) { val data: Intent? = result.data // 在这里直接处理返回的数据,比如更新UI或执行业务逻辑 data?.getStringExtra("KEY_DATA")?.let { // 处理数据逻辑 } } } // 启动目标Activity的方法 private fun startTargetActivity() { val intent = Intent(requireContext(), TargetActivity::class.java) intent.putExtra("PARAM", "test") activityResultLauncher.launch(intent) } }
二、Activity接收结果后传递给Fragment
如果必须由Activity先处理部分逻辑,再传递数据给Fragment,可选择以下两种方式:
方式1:调用Fragment的公共方法
在Activity中接收结果后,直接调用Fragment暴露的公共方法传递数据:
Activity代码:
class MainActivity : AppCompatActivity() { private val activityResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == Activity.RESULT_OK) { // 获取Fragment实例 val myFragment = supportFragmentManager.findFragmentById(R.id.fragment_container) as? MyFragment myFragment?.handleResultData(result.data) } } // 启动目标Activity fun launchTargetActivity() { val intent = Intent(this, TargetActivity::class.java) activityResultLauncher.launch(intent) } }
Fragment代码:
class MyFragment : Fragment() { // 暴露给Activity的公共方法,用于接收结果数据 fun handleResultData(data: Intent?) { data?.let { val receivedData = it.getStringExtra("KEY_DATA") // 处理数据逻辑 } } }
方式2:使用ViewModel共享数据(更解耦)
通过共享ViewModel实现Activity和Fragment的数据传递,避免两者直接依赖:
共享ViewModel代码:
class SharedResultViewModel : ViewModel() { private val _resultData = MutableLiveData<Intent?>() val resultData: LiveData<Intent?> = _resultData fun updateResultData(data: Intent?) { _resultData.value = data } }
Activity代码:
class MainActivity : AppCompatActivity() { private val sharedViewModel: SharedResultViewModel by viewModels() private val activityResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == Activity.RESULT_OK) { sharedViewModel.updateResultData(result.data) } } // 启动目标Activity逻辑... }
Fragment代码:
class MyFragment : Fragment() { // 通过activityViewModels()获取与Activity共享的ViewModel实例 private val sharedViewModel: SharedResultViewModel by activityViewModels() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // 观察数据变化,处理结果 sharedViewModel.resultData.observe(viewLifecycleOwner) { data -> data?.let { val receivedData = it.getStringExtra("KEY_DATA") // 处理数据逻辑 } } } }
内容的提问来源于stack exchange,提问作者Fahad Bin Saleem
相关产品推荐
相关产品推荐

