使用Navigation组件传参报错:Action类未实现getActionId()
我尝试通过Android Navigation组件在Fragment之间传递参数,点击CardView打开ImageDetailsFragment并传入author和download_url参数时,出现如下报错:
e: C:\Users\aziz\StudioProjects\Imageswithbase\app\build\generated\source\navigation-args\debug\com\example\images\ui\ImageListFragmentDirections.kt: (10, 16): Class 'ActionImageListFragmentToImageDetailsFragment' is not abstract and does not implement abstract member public abstract fun getActionId(): Int defined in androidx.navigation.NavDirections
相关代码
ImageGridAdapter代码
override fun onBindViewHolder(holder: ImageViewHolder, position: Int) { val images = getItem(position) holder.bind(images) holder.card.setOnClickListener { val action = ImageListFragmentDirections.actionImageListFragmentToImageDetailsFragment( author = images.author, downloadUrl = images.download_url ) holder.itemView.findNavController().navigate(action) } }
ImageDetailsFragment代码
private lateinit var author:String private lateinit var download_url:String override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) arguments?.let { author = it.getString("author").toString() download_url = it.getString("download_url").toString() } }
导航图(nav_graph)代码
<fragment android:id="@+id/imageListFragment" android:name="com.example.images.ui.ImageListFragment" android:label="Images" tools:layout="@layout/fragment_image_list"> <action android:id="@+id/action_imageListFragment_to_imageDetailsFragment" app:destination="@id/imageDetailsFragment" > <argument android:name="author" app:argType="string" /> <argument android:name="download_url" app:argType="string" /> </action> </fragment> <fragment android:id="@+id/imageDetailsFragment" android:name="com.example.images.ui.ImageDetailsFragment" android:label="Image" tools:layout="@layout/fragment_image_details" />
解决方案
- 修正导航图的参数位置:Navigation组件要求传递的参数必须定义在目标Fragment(ImageDetailsFragment)标签下,而不是嵌套在Action标签内。把
<argument>节点从Action中移到ImageDetailsFragment里,修改后的导航图如下:
<fragment android:id="@+id/imageListFragment" android:name="com.example.images.ui.ImageListFragment" android:label="Images" tools:layout="@layout/fragment_image_list"> <action android:id="@+id/action_imageListFragment_to_imageDetailsFragment" app:destination="@id/imageDetailsFragment" /> </fragment> <fragment android:id="@+id/imageDetailsFragment" android:name="com.example.images.ui.ImageDetailsFragment" android:label="Image" tools:layout="@layout/fragment_image_details"> <argument android:name="author" app:argType="string" /> <argument android:name="download_url" app:argType="string" /> </fragment>
清理并重构项目:报错来自自动生成的
navigation-args代码,修改导航图后,执行Build > Clean Project,再Build > Rebuild Project,让系统重新生成正确的Directions类。(推荐)用Safe Args规范获取参数:避免手动读取Bundle出错,直接用Safe Args自动生成的参数类获取值:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val args = ImageDetailsFragmentArgs.fromBundle(requireArguments()) author = args.author download_url = args.downloadUrl // Safe Args会自动将下划线参数名转为驼峰命名 }
内容的提问来源于stack exchange,提问作者Abdulaziz Alhobayyeb
相关产品推荐
相关产品推荐

