wake-up-neo.com

Wie kann ich Callback in Kotlin verwenden?

Ich habe View und eine CircleShape, die in dieser View Toast zeigen sollte. Und ich verwende es in Hauptaktivität .. Dies ist meine Schnittstelle 

interface OnClickListenerInterface {
  fun onClick()
}

Es ist CircleShape (es ist View in my xml) und Listener in meiner View. Ich möchte OnClick in meine Aktivität implementieren. 

 var listener: OnClickListenerInterface? = null

 mCircleShape.setOnClickListener(View.OnClickListener {
      if (listener == null) [email protected]
      listener!!.onClick()
    })

Ich weiß, dass in Kotlin Getter und Setter generische Automatik, aber wie kann ich Listener einstellen, wenn es privat ist. Es ist Code aus meiner Aktivität, aber es funktioniert nicht

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

Wie sollte ich Callback, onClickListenere in Kotlin verwenden?

6
manwhotrycoding

Auf CircleShape.kt.

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

Zu Ihrer Aktivität

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

Wenn Sie einen Lambda-Ausdruck verwenden, können Sie einen Funktionstyp verwenden. Wie es aussieht Auf CirclesShapt.kt

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

So sieht in Aktivität aus.

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

definiere eine Funktion wie diese:

  fun performWork(param1: String, myCallback: (result: String?) -> Unit) {
    // perform some network work
    // on network finished
    myCallback.invoke("result from network")
  }

dann benutze wie:

  performWork("http://..."){ result ->
  //use result
  }
1
Dan Alboteanu

Eine einfachere Lösung durch Verwendung von Lambda.

Auf CircleShape.kt.

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

Zu Ihrer Aktivität

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

Haben Sie versucht, Lambda-Ausdruck zu verwenden? Zum Beispiel in Ihrem Fall:

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

Oder wenn Sie es mehr kotlin machen wollen:

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

um Kotlin-Callbacks zu verwenden, benutze ich sie in meinen Aufrufen der API, um Erfolg oder Misserfolg zu haben 

erstellen Sie eine Enum-Klasse für den Status

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

verwenden Sie Rückruf aus Spaß

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

wenn Sie die Funktion fetchFeesList aufrufen, rufen Sie sie wie auf

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

für Toast ("Nachricht") verwenden Sie Anko Lib von GitHub: - https://github.com/Kotlin/anko

0
Rishabh Shukla

Zunächst müssen Sie diesen Code entfernen:

mCircleShape.setOnClickListener(View.OnClickListener {
      if (listener == null) [email protected]
      listener!!.onClick()
    })

Da der Listener anfangs immer null ist und der Code immer zurückgegeben wird. 

var listener: OnClickListenerInterface? = null ist bereits öffentlich (dies ist eine Standardzugriffsebene in Kotlin). So können Sie es bei Bedarf einfach in Ihrer Aktivität festlegen. Verwenden Sie den Aufruf listener?.onClick(), um ihn von Ihrer CircleShape auszulösen.

0