Android 之 Kotlin 页面间的跳转

1.android kotlin中页面跳转

在Android Kotlin开发中,页面跳转主要分为 ​​Activity间跳转​ ​ 和 ​​Fragment间导航​​ 两类。以下是具体实现方式和注意事项:

一、Activity间跳转(Intent方式)

1. ​​基础跳转​
Kotlin 复制代码
val intent = Intent(this, TargetActivity::class.java)
startActivity(intent)
  • ​关键点​ ​:目标Activity需在AndroidManifest.xml中注册。
2. ​​数据传递​
  • ​发送数据​​:

    Kotlin 复制代码
    intent.putExtra("key_name", "数据值")  // 支持String、Int等基础类型
    intent.putExtra("user", ParcelableObject)  // 自定义对象需实现Parcelable 
  • ​接收数据​​(目标Activity中):

    Kotlin 复制代码
    val data = intent.getStringExtra("key_name")
    val user = intent.getParcelableExtra<User>("user")
3. ​​带返回结果的跳转​

替代已废弃的startActivityForResult,推荐使用:

Kotlin 复制代码
// 1. 注册结果监听器
private val resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
    if (result.resultCode == Activity.RESULT_OK) {
        val data = result.data?.getStringExtra("result_key")
        // 处理返回数据[9](@ref)
    }
}

// 2. 启动Activity
val intent = Intent(this, TargetActivity::class.java)
resultLauncher.launch(intent)

// 3. 目标Activity返回数据
setResult(Activity.RESULT_OK, Intent().apply {
    putExtra("result_key", "返回数据")
})
finish()

二、Fragment间导航(Navigation组件)

1. ​​依赖配置​
Groovy 复制代码
// build.gradle.kts
dependencies {
    val nav_version = "2.7.7"
    implementation("androidx.navigation:navigation-fragment-ktx:$nav_version")
    implementation("androidx.navigation:navigation-ui-ktx:$nav_version")
}
2. ​​导航图配置(nav_graph.xml)​
复制代码
XML 复制代码
<navigation>
    <fragment android:id="@+id/homeFragment" ...>
        <action 
            android:id="@+id/action_to_detail"
            app:destination="@id/detailFragment" />
    </fragment>
    <fragment android:id="@+id/detailFragment">
        <argument 
            android:name="itemId" 
            app:argType="integer" /> <!-- 类型安全参数 -->
    </fragment>
</navigation>
3. ​​执行跳转​
复制代码
Kotlin 复制代码
// 无参数跳转
findNavController().navigate(R.id.action_to_detail)

// 带参数跳转(传统Bundle方式)
val bundle = Bundle().apply {
    putInt("itemId", 123)
}
findNavController().navigate(R.id.action_to_detail, bundle)

// 安全参数传递(推荐-Safe Args)
val direction = HomeFragmentDirections.actionToDetail(itemId = 123)
findNavController().navigate(direction)
4. ​​目标Fragment接收参数​
复制代码
Kotlin 复制代码
// Safe Args方式(需启用插件androidx.navigation.safeargs)[6](@ref)
private val args: DetailFragmentArgs by navArgs()
val itemId = args.itemId

// Bundle方式
val itemId = arguments?.getInt("itemId")

三、关键注意事项

  1. ​线程与生命周期​

    • Activity跳转:主线程直接调用

    • Fragment导航:确保在onViewCreated()后执行navigate(),避免视图未初始化。

  2. ​返回栈管理​

    • ​清除历史栈​ ​:使用app:popUpTo="@id/fragment_id" app:popUpToInclusive="true"

    • ​避免重复实例​ ​:添加app:launchSingleTop="true"

  3. ​启动模式(Activity专用)​

    AndroidManifest.xml中配置:

    Kotlin 复制代码
    <activity 
        android:name=".MainActivity"
        android:launchMode="singleTask"/>
     <!-- 可选standard/singleTop/singleTask/singleInstance -->
  4. ​类型安全​

    • 优先使用Safe Args或Parcelable对象,避免Bundle的键值对类型错误

  5. ​深度链接​

    nav_graph.xml中配置:

    复制代码
    Kotlin 复制代码
    <fragment android:id="@+id/detailFragment">
        <deepLink app:uri="example.com/detail/{itemId}" />
    </fragment>

四、方案对比

​场景​ ​推荐方案​ ​优势​
Activity间简单跳转 Intent + putExtra 代码简洁,适合基础场景
Activity带返回结果 registerForActivityResult 替代废弃API,支持链式调用
Fragment导航 Navigation组件 可视化路由、类型安全参数、返回栈管理
复杂数据传递 Parcelable/Safe Args 避免类型错误,编译时检查