Android Navigation导航场景下如何向目标Fragment传递不同参数
方案1:为不同跳转Action单独配置参数(适配现有Safe Args用法,官方推荐)
你不需要将所有参数都定义在D Fragment的目的地级别参数中,Navigation组件支持为每个跳转Action单独配置专属参数,完全匹配你示例中的调用形式:
<!-- 导航图配置示例 --> <fragment android:id="@+id/fragment_d" android:name="com.example.DFragment" /> <!-- A跳转D的Action,仅配置A需要传的参数 --> <action android:id="@+id/action_a_to_d" app:destination="@+id/fragment_d"> <argument android:name="intParam" app:argType="integer" /> <argument android:name="strParamA" app:argType="string" /> </action> <!-- B跳转D的Action,仅配置B需要传的参数 --> <action android:id="@+id/action_b_to_d" app:destination="@+id/fragment_d"> <argument android:name="floatParam" app:argType="float" /> <argument android:name="boolParam" app:argType="boolean" /> </action> <!-- C跳转D的Action,仅配置C需要传的参数 --> <action android:id="@+id/action_c_to_d" app:destination="@+id/fragment_d"> <argument android:name="doubleParam" app:argType="double" /> <argument android:name="strParamC" app:argType="string" /> </action>
配置完成后Safe Args自动生成的Direction类就会完全符合你给出的示例调用逻辑,跳转时仅需要传对应路径的参数即可。在D Fragment中接收时,直接从arguments中读取对应key的参数,或者通过by navArgs()委托获取后判空即可:
// D Fragment 接收参数示例 val intFromA = arguments?.getInt("intParam") val strFromA = arguments?.getString("strParamA") val floatFromB = arguments?.getFloat("floatParam") // 其余参数同理读取,判空即可适配不同跳转路径
方案2:目的地全局参数配置默认值
如果你希望将所有参数都统一定义在D Fragment的目的地级别,只需要给每个参数设置默认值,跳转时未传递的参数会自动填充默认值,无需手动传全所有参数:
<fragment android:id="@+id/fragment_d" android:name="com.example.DFragment"> <argument android:name="intParam" app:argType="integer" app:defaultValue="-1" /> <argument android:name="strParamA" app:argType="string" app:defaultValue="@null" /> <argument android:name="floatParam" app:argType="float" app:defaultValue="-1F" /> <argument android:name="boolParam" app:argType="boolean" app:defaultValue="false" /> <argument android:name="doubleParam" app:argType="double" app:defaultValue="-1.0" /> <argument android:name="strParamC" app:argType="string" app:defaultValue="@null" /> </fragment>
跳转时只需要传递当前路径需要的参数,未传递的参数自动使用默认值,在D中判断参数是否不等于默认值即可判断是否为当前路径传入的有效参数。
方案3:密封类封装入参(适合复杂参数场景)
如果参数逻辑复杂,可通过Parcelable密封类统一封装不同路径的入参,D仅需要定义一个Parcelable类型的参数即可:
- 先定义密封类(需开启Kotlin
parcelize插件)
sealed class DParams : Parcelable { @Parcelize data class FromA(val intParam: Int, val strParam: String) : DParams() @Parcelize data class FromB(val floatParam: Float, val boolParam: Boolean) : DParams() @Parcelize data class FromC(val doubleParam: Double, val strParam: String) : DParams() }
- 导航图中D仅需要配置一个参数:
<fragment android:id="@+id/fragment_d" android:name="com.example.DFragment"> <argument android:name="d_params" app:argType="com.example.DParams" /> </fragment>
- 跳转时传入对应密封类实例,D中直接判断类型即可拿到所有参数:
// D中接收参数 val params = arguments?.getParcelable<DParams>("d_params") when (params) { is DParams.FromA -> { /* 处理A传来的参数 */ } is DParams.FromB -> { /* 处理B传来的参数 */ } is DParams.FromC -> { /* 处理C传来的参数 */ } }
内容的提问来源于stack exchange,提问作者misterios
相关产品推荐
相关产品推荐

