为什么在导航中切换屏幕时无法获取 null 作为参数?

yby*_*byb 2 android android-navigation android-safe-args android-navigation-graph

我使用navigationSafeArgsswitch screenspass data

\n

当在屏幕上选择数据时A,数据在屏幕切换的同时传输。

\n

但是,有时屏幕会在没有任何操作的情况下A切换到屏幕B

\n

null我决定在这种情况下发送。

\n

但我不断收到以下错误:

\n
E/AndroidRuntime: FATAL EXCEPTION: main\n    Process: com.example.lightweight, PID: 9555\n    java.lang.RuntimeException: java.lang.reflect.InvocationTargetException\n        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:612)\n        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)\n     Caused by: java.lang.reflect.InvocationTargetException\n        at java.lang.reflect.Method.invoke(Native Method)\n        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)\n        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)\xc2\xa0\n     Caused by: java.lang.reflect.InvocationTargetException\n        at java.lang.reflect.Method.invoke(Native Method)\n        at androidx.navigation.NavArgsLazy.getValue(NavArgsLazy.kt:54)\n        at androidx.navigation.NavArgsLazy.getValue(NavArgsLazy.kt:35)\n        at com.example.lightweight.fragment.WriteRoutineFragment.getArgs(WriteRoutineFragment.kt:20)\n        at com.example.lightweight.fragment.WriteRoutineFragment.onViewCreated(WriteRoutineFragment.kt:44)\n        at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:2985)\n
Run Code Online (Sandbox Code Playgroud)\n

导航.xml

\n
<fragment\n        android:id="@+id/writeRoutine"\n        android:name="com.example.lightweight.fragment.WriteRoutineFragment"\n        android:label="fragment_write_routine"\n        tools:layout="@layout/fragment_write_routine" >\n        <action\n            android:id="@+id/action_writeRoutineFragment_to_workoutListTabFragment"\n            app:destination="@id/workoutListTabFragment" />\n        <argument\n            android:name="workout"\n            app:argType="string"\n            app:nullable="true" />\n</fragment>\n
Run Code Online (Sandbox Code Playgroud)\n

在适配器中

\n
inner class ViewHolder(itemView: View, context: Context) : RecyclerView.ViewHolder(itemView) {\n        private val tv: TextView = itemView.findViewById(R.id.workout)\n\n        init {\n            tv.setOnClickListener { view ->\n                val workout = tv.text.toString()\n                val action: NavDirections = WorkoutListTabFragmentDirections.actionWorkoutListTabToWriteRoutine(workout)\n                view.findNavController().navigate(action)\n            }\n        }\n\n        fun bind(item: String) {\n            tv.text = item\n        }\n    }\n
Run Code Online (Sandbox Code Playgroud)\n

什么原因?

\n

Dươ*_*inh 5

您应该添加解决方法参数的defaultValue。这里因为你已经设置了app:nullable="true",所以你应该设置android:defaultValue="@null"

修改您创建解决方法参数的方式,如下所示:

<argument
   android:name="workout"
   app:argType="string"
   android:defaultValue="@null"
   app:nullable="true" />
Run Code Online (Sandbox Code Playgroud)

详细信息:支持的参数类型 - 导航