Android开发中从不同起点导航到同一目的地如何传递不同参数
实现方案
这个需求完全可以实现,常见的实现方式分两种,分别对应原生Bundle传参和Jetpack Navigation组件的Safe Args传参方案,具体操作如下:
方案1:原生Bundle传参(未引入Navigation组件场景)
- 第一步:在Fragment3中定义接收参数逻辑,所有可选参数声明为可空类型
示例代码:class Fragment3 : Fragment() { // 来自Fragment1的参数 private var x: X? = null private var y: Y? = null // 来自Fragment2的参数 private var z: Z? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) arguments?.let { x = it.getSerializable("key_x") as? X y = it.getParcelable("key_y") as? Y z = it.getParcelable("key_z") as? Z } // 根据非空参数判断跳转来源,执行对应逻辑 if (x != null && y != null) { // 从Fragment1跳转的处理逻辑 } else if (z != null) { // 从Fragment2跳转的处理逻辑 } } } - 第二步:Fragment1跳转时传入对应参数
示例代码:val fragment3 = Fragment3() val bundle = Bundle() bundle.putSerializable("key_x", x实例) bundle.putParcelable("key_y", y实例) fragment3.arguments = bundle // 执行Fragment事务跳转 parentFragmentManager.beginTransaction() .replace(R.id.container, fragment3) .addToBackStack(null) .commit() - 第三步:Fragment2跳转时传入对应参数
示例代码:val fragment3 = Fragment3() val bundle = Bundle() bundle.putParcelable("key_z", z实例) fragment3.arguments = bundle // 执行Fragment事务跳转 parentFragmentManager.beginTransaction() .replace(R.id.container, fragment3) .addToBackStack(null) .commit()
注意:自定义类型X、Y、Z需要实现
Serializable或Parcelable接口才能放入Bundle传递,优先推荐实现Parcelable,性能更优。如果担心不同来源参数可能存在非空冲突,可以额外增加一个Int类型的来源标识参数,明确标记跳转来源,逻辑判断更稳妥。
方案2:Jetpack Navigation Safe Args 传参
如果项目使用Jetpack Navigation组件管理路由,更推荐用类型安全的Safe Args实现:
- 第一步:在导航图中给Fragment3声明所有可选参数,设置默认值为null
示例导航图配置:<fragment android:id="@+id/fragment3" android:name="com.xxx.Fragment3"> <argument android:name="x" app:argType="com.xxx.X" android:defaultValue="@null" /> <argument android:name="y" app:argType="com.xxx.Y" android:defaultValue="@null" /> <argument android:name="z" app:argType="com.xxx.Z" android:defaultValue="@null" /> </fragment> - 第二步:Fragment1跳转时传递x、y参数
示例代码:val direction = Fragment1Directions.actionFragment1ToFragment3(x = x实例, y = y实例) findNavController().navigate(direction) - 第三步:Fragment2跳转时传递z参数
示例代码:val direction = Fragment2Directions.actionFragment2ToFragment3(z = z实例) findNavController().navigate(direction) - 第四步:Fragment3中接收参数
示例代码:private val args: Fragment3Args by navArgs() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) val x = args.x val y = args.y val z = args.z // 按参数非空情况判断来源执行对应逻辑即可 }
内容的提问来源于stack exchange,提问作者user17035623
相关产品推荐
相关产品推荐

