You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 21:15:35