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

Kotlin中Activity与Fragment跳转及返回原Fragment的实现方法

一、Fragment跳转Activity,返回时回到原Fragment

正常情况下,从Fragment启动Activity后,按返回键会自动回到原Fragment所在的宿主Activity,原Fragment会保持之前的状态(除非宿主Activity被系统回收)。具体实现如下:

1. Fragment中启动Activity(推荐使用registerForActivityResult)

在你的Fragment里初始化Activity结果回调,然后在按钮点击时启动目标Activity:

private val launchTargetActivity = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
    // 可选:处理Activity返回的结果,不需要的话留空即可
    if (result.resultCode == Activity.RESULT_OK) {
        val data = result.data
        // 处理返回的数据
    }
}

// 按钮点击事件
yourButton.setOnClickListener {
    val intent = Intent(requireContext(), TargetActivity::class.java)
    // 如需传递参数,可通过intent.putExtra()添加
    launchTargetActivity.launch(intent)
}

2. 处理宿主Activity被回收的情况

如果宿主Activity因内存不足被系统回收,重新创建时需要恢复原Fragment:
在宿主Activity中重写onSaveInstanceState和onCreate方法:

class MainActivity : AppCompatActivity() {
    private val FRAGMENT_KEY = "current_fragment"

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        // 保存当前显示的Fragment实例
        supportFragmentManager.findFragmentById(R.id.fragment_container)?.let {
            supportFragmentManager.putFragment(outState, FRAGMENT_KEY, it)
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        if (savedInstanceState != null) {
            // 恢复之前保存的Fragment
            val savedFragment = supportFragmentManager.getFragment(savedInstanceState, FRAGMENT_KEY)
            supportFragmentManager.beginTransaction()
                .replace(R.id.fragment_container, savedFragment)
                .commit()
        } else {
            // 首次加载默认Fragment
            supportFragmentManager.beginTransaction()
                .replace(R.id.fragment_container, YourOriginalFragment())
                .commit()
        }
    }
}
二、Activity跳转至Fragment

Activity无法直接跳转Fragment,必须通过Fragment的宿主Activity来完成切换。核心思路是:启动宿主Activity时传递目标Fragment的标识,让宿主Activity根据标识切换到对应Fragment。

1. 发起跳转的Activity中代码

比如从SourceActivity跳转到宿主MainActivity中的TargetFragment:

yourButton.setOnClickListener {
    val intent = Intent(this, MainActivity::class.java)
    // 传递目标Fragment的标识,这里用字符串区分,也可以用常量
    intent.putExtra("TARGET_FRAGMENT_TAG", "TARGET_FRAGMENT")
    // 添加标记避免重复创建MainActivity,保持栈顶状态
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP)
    startActivity(intent)
}

2. 宿主Activity中处理切换

在宿主Activity中接收参数,根据标识切换到目标Fragment:

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        // 处理启动时的参数
        handleFragmentSwitch(intent)
    }

    override fun onNewIntent(intent: Intent?) {
        super.onNewIntent(intent)
        setIntent(intent)
        // 处理再次启动时的参数(因为设置了SINGLE_TOP,不会重新创建Activity)
        handleFragmentSwitch(intent)
    }

    private fun handleFragmentSwitch(intent: Intent?) {
        intent?.getStringExtra("TARGET_FRAGMENT_TAG")?.let { tag ->
            val targetFragment = when(tag) {
                "TARGET_FRAGMENT" -> TargetFragment()
                // 可扩展其他Fragment的判断
                else -> YourOriginalFragment()
            }
            
            val transaction = supportFragmentManager.beginTransaction()
                .replace(R.id.fragment_container, targetFragment)
            // 可选:加入回退栈,按返回键可回到之前的Fragment
            transaction.addToBackStack(null)
            transaction.commit()
        }
    }
}

内容的提问来源于stack exchange,提问作者Shyama Prabha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 10:05:23