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

如何从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 07:15:43