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?
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
}
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
}
Ê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") }
)
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
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.