如何通过NavController传递额外的对象类型参数至目标Fragment
在Android Jetpack Navigation中传递自定义对象,官方推荐使用Safe Args插件(类型安全、避免手动传参错误),也可以通过Parcelable序列化结合Bundle实现,以下是具体步骤:
方法一:使用Safe Args(推荐)
1. 配置Safe Args插件
首先在项目级build.gradle(或build.gradle.kts)中添加插件依赖:
buildscript { dependencies { classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.7.7" } }
然后在模块级build.gradle(或build.gradle.kts)中应用插件:
// Java项目 apply plugin: "androidx.navigation.safeargs" // Kotlin项目 apply plugin: "androidx.navigation.safeargs.kotlin"
2. 让数据类实现Parcelable
你的Fridge.fridge和Result数据类需要实现Parcelable接口,Kotlin可以用@Parcelize注解简化实现:
import android.os.Parcelable import kotlinx.parcelize.Parcelize object Fridge { @Parcelize data class fridge( val number: Int, val offset: Int, val results: List<Result>, val totalResults: Int ) : Parcelable @Parcelize data class Result( // 补全Result类的字段 ) : Parcelable }
注意:若使用Java,需手动实现Parcelable的
writeToParcel和CREATOR方法。
3. 在导航图中定义参数
打开导航图文件(res/navigation/nav_graph.xml),为目标FragmentfridgeDishViewFragment添加参数配置:
<fragment android:id="@+id/fridgeDishViewFragment" android:name="com.yourpackage.FridgeDishViewFragment"> <argument android:name="fridgeData" app:argType="com.yourpackage.Fridge$fridge" /> </fragment>
替换
com.yourpackage为实际包名,Fridge$fridge是嵌套类的引用格式。
4. 传递参数
修改跳转代码,使用Safe Args自动生成的Action类传递对象:
// 假设已获取到fridge对象:val fridgeData = Fridge.fridge(...) val action = FridgeFragmentDirections.actionFridgeToFridgeDishViewFragment(fridgeData) findNavController().navigate(action)
5. 接收参数
在FridgeDishViewFragment中通过Safe Args获取传递的对象:
val args = FridgeDishViewFragmentArgs.fromBundle(requireArguments()) val fridgeData = args.fridgeData // 后续即可使用fridgeData中的数据
方法二:直接使用Bundle传递Parcelable对象
若暂时不想使用Safe Args,可直接通过Bundle传递:
1. 数据类实现Parcelable(同方法一的步骤2)
2. 构建Bundle并传递
修改跳转代码:
val fridgeData = Fridge.fridge(...) val bundle = Bundle().apply { putParcelable("fridge_data", fridgeData) } findNavController().navigate(R.id.action_fridge_to_fridgeDishViewFragment, bundle)
3. 接收参数
在目标Fragment中获取对象:
val fridgeData = arguments?.getParcelable<Fridge.fridge>("fridge_data") // 注意判空处理 fridgeData?.let { // 使用数据 }
注意事项
- 确保所有嵌套数据类(如
Result)都实现Parcelable,否则List<Result>无法正常序列化。 - 传递的对象体积不宜过大,避免Bundle超限引发异常。
内容的提问来源于stack exchange,提问作者Shivansh Tariyal
相关产品推荐
相关产品推荐

