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

Fragment中SurfaceHolder.Callback实现报错求助(Kotlin)

解决SurfaceHolder.Callback未覆盖方法的问题

兄弟,我一眼就看出问题所在了——你在实现SurfaceHolder.Callback接口时,方法的参数签名和接口要求的不匹配,尤其是参数的可空性,导致Kotlin编译器认为你没有正确覆盖接口的抽象方法。

错误根源

Java的SurfaceHolder.Callback接口里的三个方法,参数holder都是不可空的SurfaceHolder类型,但你在Kotlin代码里把holder声明成了可空的SurfaceHolder?,这就相当于定义了全新的方法,而不是覆盖接口要求的方法,所以编译器会提示“未覆盖任何方法”;同时因为没有实现接口的所有抽象方法,又会报“object is not abstract and does not implement abstract member”的错误。

修复方案

把回调方法里的holder: SurfaceHolder?改成holder: SurfaceHolder(去掉问号),同时确保方法的其他参数类型和顺序完全匹配接口要求。

修改后的overlay.apply代码块如下:

overlay.apply {
    setZOrderOnTop(true)
    holder.setFormat(PixelFormat.TRANSPARENT)
    holder.addCallback(object : SurfaceHolder.Callback {
        // 去掉holder的可空标记,改为非空SurfaceHolder
        override fun surfaceChanged(
            holder: SurfaceHolder, format: Int, width: Int, height: Int
        ) {
        }

        override fun surfaceDestroyed(holder: SurfaceHolder) {
        }

        override fun surfaceCreated(holder: SurfaceHolder) {
            // holder已是非空,直接调用方法即可,无需let包裹
            drawOverlay(holder, DESIRED_HEIGHT_CROP_PERCENT, DESIRED_WIDTH_CROP_PERCENT )
        }
    })
}

额外说明

在Kotlin中实现Java接口时,要特别注意参数的可空性:Java里默认参数都是非空的(除非用@Nullable标注),所以对应的Kotlin方法参数也要用非空类型,否则编译器会认为这不是同一个方法。修改后surfaceCreated方法里的holder已经是非空状态,直接调用drawOverlay就行,不用再用let包裹啦。

内容的提问来源于stack exchange,提问作者Malorimorow

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 19:12:47