2017-06-02 3 views
4

J'essaie d'utiliser un SurfaceView dans Android pour tenir un aperçu de la caméra. La documentation me dit que j'ai besoin d'appeler startPreview dans le callback surfaceCreated pour le support de surface. Je suis en train de régler le rappel comme siImplémentation de l'interface de façon anonyme dans Kotlin résultats dans l'erreur "n'a pas de constructeurs"

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

    } 

    fun surfaceCreated(holder: SurfaceHolder) { 

    } 

    fun surfaceDestroyed(holder: SurfaceHolder) { 

    } 
}) 

Cependant, je reçois l'erreur:

SurfaceHolder.Callback has no constructors.

Je suis confus pourquoi cela ne fonctionne pas quand quelque chose comme ça fait:

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

Votre second cas est faux aussi bien, vous ne surchargez pas réellement le 'run()' method dans Runnable mais en passant dans un lambda qui contient une fonction 'run()' imbriquée qui n'est jamais appelée. Les deux exemples sont invalides. –

+0

Aussi pour l'exemple d'exécution pour Runnable, vous n'avez pas non plus besoin de spécifier l'interface et pouvez simplement utiliser la conversion SAM et passer un lambda 'Thread {...}' –

Répondre

5

pour créer un objet d'une sous-classe anonyme vous devez utiliser le object: expression:

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) { 
     ... 
    } 
}) 

et ne pas oublier d'utiliser le mot-clé override par méthode surchargée ainsi;)

+0

Veuillez ajouter une note sur l'utilisation d'une expression 'object' aussi, ce qui faisait également partie de votre solution. Et lien vers la documentation https://kotlinlang.org/docs/reference/object-declarations.html#object-expressions –

+0

@JaysonMinard Oui, j'ai oublié de mentionner cette erreur aussi ... bonne prise;) –

+0

Si 'SurfaceHolder. Callback' est une interface, alors non '()' après. –