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