You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Navigation组件传参报错:Action类未实现getActionId()

解决Navigation组件传递参数时的Action类实现错误

我尝试通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 23:20:39