2017-11-26 4 views
1

Ich habe View und eine CircleShape, die Toast in dieser Ansicht anzeigen sollte. Und ich benutze es in der Hauptaktivität. Das ist meine SchnittstelleWie kann ich Callback in Kotlin verwenden?

interface OnClickListenerInterface { 
    fun onClick() 
} 

Es ist CircleShape (es ist Blick in meiner xml) und Zuhörer in meiner Ansicht. Ich möchte OnClick in meiner 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 generic Automatik, aber wie ich Zuhörer es privat, wenn festlegen. Es ist Code von meiner Aktivität, aber es funktioniert nicht

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

Wie soll ich Rückruf, onClickListenere in Kotlin benutzen?

+0

"Es funktioniert nicht" - was ist der Fehler? – Moira

+0

Listener ist nicht aktiv –

Antwort

0

allererst Sie diesen Code entfernen müssen:

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

Da Zuhörer immer null auf den ersten und den Code einfach immer wieder.

var listener: OnClickListenerInterface? = null ist bereits öffentlich (dies ist eine Standardzugriffsebene in Kotlin). Sie können es also bei Bedarf in Ihre Aktivität einfügen. Verwenden Sie listener?.onClick() Aufruf, um es von Ihrem CircleShape auszulösen.

0

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

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

Oder wenn Sie wollen es mehr Kotlin Stil machen:

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

Auf CircleShape.kt.

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

Auf Ihrer Aktivität

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

Wenn Sie gonna verwenden Lambda-Ausdruck sind, ist hier, wie es wie Auf CirclesShapt.kt sieht

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

So in Aktivität aussieht.

mCircleShape.setOnClickListener { 
    // Do something here 
} 
Verwandte Themen