2017-06-02 29 views
4

Androidプレビューを保持するためにSurfaceViewを使用しようとしています。ドキュメンテーションでは、サーフェスホルダーのsurfaceCreatedコールバックでstartPreviewを呼び出す必要があることがわかります。インターフェイスを匿名でKotlinに実装すると「コンストラクタがありません」というエラーが発生する

SurfaceHolder.Callback has no constructors.

このようなものがない場合、これは動作しませんなぜ私は混乱している:私はしかし、私はエラーを取得するので、

this.surface!!.holder!!.addCallback(SurfaceHolder.Callback() { 
    fun surfaceChanged(holder: SurfaceHolder, format: Int, 
         width: Int, height: Int) { 

    } 

    fun surfaceCreated(holder: SurfaceHolder) { 

    } 

    fun surfaceDestroyed(holder: SurfaceHolder) { 

    } 
}) 

のようにコールバックを設定しようとしている

Thread(Runnable() { 
    fun run() { 
     ...   
    } 
}) 
+1

あなたの第二の場合は、同様に間違っている、あなたは実際に 'の実行を()'オーバーライドされていませんメソッドを呼び出すことはできませんが、呼び出されないネストされた 'run()'関数を含むラムダを渡します。どちらの例も無効です。 –

+0

Runnableの実行例についても、インタフェースを指定する必要はなく、SAM変換を使用してラムダ 'Thread {...} 'を渡すことができます –

答えて

5

あなたがを使用する必要が匿名サブクラスのオブジェクトを作成するには:

this.surface!!.holder!!.addCallback(object: SurfaceHolder.Callback { 
    override fun surfaceChanged(holder: SurfaceHolder, format: Int, 
           width: Int, height: Int) { 
     ...   
    } 

    override fun surfaceCreated(holder: SurfaceHolder) { 
     ... 
    } 

    override fun surfaceDestroyed(holder: SurfaceHolder) { 
     ... 
    } 
}) 

と同様オーバーライドされたメソッドごとoverrideキーワードを使用することを忘れないでください。)

+0

' object'式の使用に関する注意を追加してください同様に、あなたの修正の一部でもありました。そして、ドキュメントへのリンクhttps://kotlinlang.org/docs/reference/object-declarations.html#object-expressions –

+0

@JaysonMinardええ、私もそのエラーについて言及するのを忘れました...良いキャッチ;) –

+0

'SurfaceHolder。コールバックはインタフェースであり、その後には '()'がありません。 –

関連する問題