web-dev-qa-db-fra.com

Comment puis-je utiliser le rappel dans Kotlin?

J'ai View et un CircleShape, ce qui devrait montrer du pain grillé dans cette vue. Et je l'utilise dans l'activité principale . C'est mon interface 

interface OnClickListenerInterface {
  fun onClick()
}

C’est CircleShape (c’est View in my xml) et auditeur dans my View. Je veux implémenter OnClick dans mon activité. 

 var listener: OnClickListenerInterface? = null

 mCircleShape.setOnClickListener(View.OnClickListener {
      if (listener == null) return@OnClickListener
      listener!!.onClick()
    })

Je sais que, dans Kotlin, les getters et setters automatiques génériques, mais comment je peux définir auditeur si privé C'est le code de mon activité, mais ça ne marche pas

CircleShape.listener  = object :OnClickListenerInterface{
      override fun onClick() {
        ToastUtils.showSuccessMessage(getContext(),"pressed")
      }
    }

Comment devrais-je utiliser Callback, onClickListenere dans Kotlin?

6
manwhotrycoding

Sur CircleShape.kt.

private listener OnClickListenerInterface? = null
...
fun setOnClickListener(listener: OnClickListenerInterface){
    this.listener = listener
}

Sur votre activité

mCircleShape.setOnClickListener(object: CircleShape.OnClickListenerInterface {
    override fun onClick(){ // Do something here
    }
}

Si vous utilisez l'expression lambda, vous pouvez utiliser un type de fonction. Voici à quoi ça ressemble Sur CirclesShapt.kt

fun setOnClickListener(listener: () -> Unit){
}

Donc, dans l'activité ressemble.

mCircleShape.setOnClickListener {
  // Do something here
}
7
dr3k

Une solution plus simple en utilisant lambda.

Sur CircleShape.kt.

var listener: (()->Unit)? = null
...
// When you want to invoke the listener
listener?.invoke()

Sur votre activité

mCircleShape.listener = {
    // Do something when you observed a call
}
1
Weidian Huang

Êtes-vous essayé d'utiliser l'expression lambda? Par exemple dans votre cas:

mCircleShape.setOnClickListener( 
    { _ -> ToastUtils.showSuccessMessage(context,"pressed") }
)

Ou si vous voulez le rendre plus style kotlin:

mCircleShape.listener = ( 
    { _ -> ToastUtils.showSuccessMessage(context,"pressed") }
)
0
Gabriel Janucik

pour utiliser les callbacks Kotlin, Je les utilise dans mes appels api de succès ou d’échec use 

créer une classe enum pour state

enum class APIState(val result: Boolean) {
SUCCESS(true),
FAILURE(false)}

utiliser call back in fun

 private fun fetchFeesList(studentID:String,call:(APIState)->Unit){
 ... do stuff here , and use call(APIState.SUCCESS) or call(APIState.FAILURE) }

lorsque vous appelez la fonction fetchFeesList, appelez-la comme

fetchFeesList(studentID){
        val res = it.result
        if(res){
            toast("success")
        }else {
            toast("failure")
        }
    }

pour les toasts ("message"), utilisez Anko Lib de GitHub: - https://github.com/Kotlin/anko

0
Rishabh Shukla

Tout d'abord, vous devez supprimer ce code:

mCircleShape.setOnClickListener(View.OnClickListener {
      if (listener == null) return@OnClickListener
      listener!!.onClick()
    })

Parce que listener est toujours nul au début et votre code est toujours renvoyé. 

var listener: OnClickListenerInterface? = null est déjà public (il s'agit d'un niveau d'accès par défaut dans Kotlin). Vous pouvez donc le définir dans votre activité, le cas échéant. Utilisez l'appel listener?.onClick() pour le déclencher depuis votre CircleShape.

0
Yevhenii Kanivets