如何从Fragment向Activity回传结果并将ActivityResultContracts加入MyLifecycleObserver
Fragment 回传结果给宿主Activity并结束Activity(基于LifecycleObserver实现)
步骤1:创建带ActivityResult的LifecycleObserver
把ActivityResult的逻辑封装到LifecycleObserver中,实现和Activity代码解耦:
import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts import androidx.fragment.app.FragmentActivity import androidx.lifecycle.DefaultLifecycleObserver import androidx.lifecycle.LifecycleOwner import android.app.Activity import android.content.Intent class MyLifecycleObserver(private val activity: FragmentActivity) : DefaultLifecycleObserver { private lateinit var startActivityLauncher: ActivityResultLauncher<Intent> override fun onCreate(owner: LifecycleOwner) { super.onCreate(owner) // 初始化启动器,监听返回结果 startActivityLauncher = activity.registerForActivityResult( ActivityResultContracts.StartActivityForResult() ) { result -> if (result.resultCode == Activity.RESULT_OK) { // 提取Fragment回传的数据 val resultData = result.data?.getStringExtra("FRAGMENT_RESULT") // 交给宿主Activity处理结果 (activity as YourHostActivity).processResult(resultData) // 处理完成后结束宿主Activity activity.finish() } } } // 暴露方法给宿主Activity,用于启动目标Fragment所在的Activity fun launchTargetActivity(intent: Intent) { startActivityLauncher.launch(intent) } }
步骤2:宿主Activity注册Observer并处理结果
在需要接收结果的宿主Activity中注册Observer,同时定义结果处理方法:
import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.widget.Button import android.widget.Toast class YourHostActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_host) // 注册LifecycleObserver val observer = MyLifecycleObserver(this) lifecycle.addObserver(observer) // 示例:点击按钮启动包含目标Fragment的Activity findViewById<Button>(R.id.btn_launch_target).setOnClickListener { val intent = Intent(this, TargetActivity::class.java) observer.launchTargetActivity(intent) } } // 接收并处理Fragment回传的结果 fun processResult(data: String?) { data?.let { Toast.makeText(this, "收到回传结果:$it", Toast.LENGTH_SHORT).show() // 这里可根据需求添加业务逻辑,比如更新UI、存储数据等 } } }
步骤3:目标Fragment回传结果并结束所在Activity
在包含目标Fragment的Activity中,Fragment通过宿主Activity设置结果并结束自身Activity:
import android.app.Activity import android.content.Intent import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment import android.widget.Button class TargetFragment : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { val view = inflater.inflate(R.layout.fragment_target, container, false) // 示例:点击按钮触发结果回传 view.findViewById<Button>(R.id.btn_send_result).setOnClickListener { sendResultToHost() } return view } private fun sendResultToHost() { val resultIntent = Intent().apply { putExtra("FRAGMENT_RESULT", "这是Fragment回传的业务数据") } // 设置结果码和数据,然后结束当前Activity requireActivity().setResult(Activity.RESULT_OK, resultIntent) requireActivity().finish() } }
关键注意点
- 必须在Activity的
onCreate生命周期内调用registerForActivityResult,这里借助LifecycleObserver的onCreate回调,完全符合官方要求。 - 若宿主Activity直接内嵌目标Fragment(无需跳转新Activity),不需要使用
StartActivityForResult,直接通过ViewModel共享数据或接口回调即可实现结果传递。 - 若不需要立即结束宿主Activity,可以将
activity.finish()调整到业务逻辑完成后的合适时机执行。
内容的提问来源于stack exchange,提问作者Yatin
相关产品推荐
相关产品推荐

