我使用navigation
和SafeArgs
来切换屏幕
和传递数据
。
当在屏幕A
上选择数据时,数据在屏幕切换的同时传输。
但是,有时屏幕A
会切换到屏幕B
而不进行任何操作。
在这种情况下,我决定发送 null
。
但我不断收到以下错误:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.lightweight, PID: 9555
java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:612)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at androidx.navigation.NavArgsLazy.getValue(NavArgsLazy.kt:54)
at androidx.navigation.NavArgsLazy.getValue(NavArgsLazy.kt:35)
at com.example.lightweight.fragment.WriteRoutineFragment.getArgs(WriteRoutineFragment.kt:20)
at com.example.lightweight.fragment.WriteRoutineFragment.onViewCreated(WriteRoutineFragment.kt:44)
at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:2985)
navigation.xml
<fragment
android:id="@+id/writeRoutine"
android:name="com.example.lightweight.fragment.WriteRoutineFragment"
android:label="fragment_write_routine"
tools:layout="@layout/fragment_write_routine" >
<action
android:id="@+id/action_writeRoutineFragment_to_workoutListTabFragment"
app:destination="@id/workoutListTabFragment" />
<argument
android:name="workout"
app:argType="string"
app:nullable="true" />
</fragment>
在适配器中
inner class ViewHolder(itemView: View, context: Context) : RecyclerView.ViewHolder(itemView) {
private val tv: TextView = itemView.findViewById(R.id.workout)
init {
tv.setOnClickListener { view ->
val workout = tv.text.toString()
val action: NavDirections = WorkoutListTabFragmentDirections.actionWorkoutListTabToWriteRoutine(workout)
view.findNavController().navigate(action)
}
}
fun bind(item: String) {
tv.text = item
}
}
原因是什么?
最佳答案
您应该添加解决方法参数的defaultValue。这里因为你设置了app:nullable="true"
,所以你应该设置android:defaultValue="@null"
。
修改您创建解决方法参数的方式,如下所示:
<argument
android:name="workout"
app:argType="string"
android:defaultValue="@null"
app:nullable="true" />
关于android - 为什么在导航中切换屏幕时无法获取 null 作为参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68657150/