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

标签 android android-navigation android-navigation-graph android-safe-args

我使用navigationSafeArgs切换屏幕传递数据

当在屏幕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" />

更多信息:Supported argument types - Navigation

关于android - 为什么在导航中切换屏幕时无法获取 null 作为参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68657150/

相关文章:

android - 多种风格的导航组件

Android 导航组件 Activity Intent 标志

java - 为什么 args 类不生成导航图 fragment ?

javascript - 如何从数据库下载图像?

android - 如何为印地语将文本添加到语音中?

java - 从另一个 fragment 返回后如何防止 fragment 刷新recyclerview/保存recyclerview位置

java - fragment 未显示在 Android 导航组件中

android - 从图像 URL 获取缩略图 URL

android - react 原生安卓 : Fetch Requests only working when React Native Debugger is connected

Android:使用 navigateUpFromSameTask() 时转换错误