1.android kotlin中页面跳转
在Android Kotlin开发中,页面跳转主要分为 Activity间跳转 和 Fragment间导航 两类。以下是具体实现方式和注意事项:
一、Activity间跳转(Intent方式)
1. 基础跳转
Kotlin
val intent = Intent(this, TargetActivity::class.java)
startActivity(intent)
- 关键点 :目标Activity需在
AndroidManifest.xml
中注册。
2. 数据传递
-
发送数据:
Kotlinintent.putExtra("key_name", "数据值") // 支持String、Int等基础类型 intent.putExtra("user", ParcelableObject) // 自定义对象需实现Parcelable
-
接收数据(目标Activity中):
Kotlinval 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")
三、关键注意事项
-
线程与生命周期
-
Activity跳转:主线程直接调用
-
Fragment导航:确保在
onViewCreated()
后执行navigate()
,避免视图未初始化。
-
-
返回栈管理
-
清除历史栈 :使用
app:popUpTo="@id/fragment_id" app:popUpToInclusive="true"
-
避免重复实例 :添加
app:launchSingleTop="true"
。
-
-
启动模式(Activity专用)
在
AndroidManifest.xml
中配置:Kotlin<activity android:name=".MainActivity" android:launchMode="singleTask"/> <!-- 可选standard/singleTop/singleTask/singleInstance -->
-
类型安全
-
优先使用Safe Args或Parcelable对象,避免Bundle的键值对类型错误
。
-
-
深度链接
在
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 | 避免类型错误,编译时检查 |