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
相关产品推荐
相关产品推荐

