ビューと1つのCircleShapeがあり、このビューでトーストを表示する必要があります。そして、私はそれをメインのアクティビティで使用しています。これは私のインターフェースです
interface OnClickListenerInterface {
fun onClick()
}
それはCircleShape(私のxmlではView)であり、私のViewではリスナーです。アクティビティにOnClickを実装します。
var listener: OnClickListenerInterface? = null
mCircleShape.setOnClickListener(View.OnClickListener {
if (listener == null) return@OnClickListener
listener!!.onClick()
})
Kotlinのgetterおよびsetterの汎用オートマチックでは知っていますが、プライベートの場合はどのようにリスナーを設定できますか。それは私のアクティビティからのコードですが、動作しません
CircleShape.listener = object :OnClickListenerInterface{
override fun onClick() {
ToastUtils.showSuccessMessage(getContext(),"pressed")
}
}
KotlinでコールバックonClickListenereを使用するにはどうすればよいですか?
ラムダを使用した、より簡単なソリューション。
CircleShape.kt内で、ラムダ関数を宣言します。
var listener: (()->Unit)? = null
...
// When you want to invoke the listener
listener?.invoke()
あなたの活動の中
mCircleShape.listener = {
// Do something when you observed a call
}
CircleShape.ktで。
private listener OnClickListenerInterface? = null
...
fun setOnClickListener(listener: OnClickListenerInterface){
this.listener = listener
}
あなたの活動について
mCircleShape.setOnClickListener(object: CircleShape.OnClickListenerInterface {
override fun onClick(){ // Do something here
}
}
ラムダ式を使用する場合は、関数タイプを使用できます。 CirclesShapt.ktでの表示方法
fun setOnClickListener(listener: () -> Unit){
listener() // or you could use optional if the lister is nullable "listener?.invoke()"
}
だから、活動中のように見えます。
mCircleShape.setOnClickListener {
// Do something here
}
kotlinコールバックを使用するには、成功または失敗の使用のためにAPI呼び出しで使用します
状態の列挙クラスを作成します
enum class APIState(val result: Boolean) {
SUCCESS(true),
FAILURE(false)}
楽しくコールバックを使用する
private fun fetchFeesList(studentID:String,call:(APIState)->Unit){
... do stuff here , and use call(APIState.SUCCESS) or call(APIState.FAILURE) }
関数fetchFeesListを呼び出すときは、次のように呼び出します
fetchFeesList(studentID){
val res = it.result
if(res){
toast("success")
}else {
toast("failure")
}
}
toast( "message")には、GitHubのAnko Libを使用します。- https://github.com/Kotlin/anko
次のような関数を定義します。
fun performWork(param1: String, myCallback: (result: String?) -> Unit) {
// perform some network work
// on network finished
myCallback.invoke("result from network")
}
次のように使用します:
performWork("http://..."){ result ->
//use result
}
ラムダ式を使用しようとしましたか?あなたの場合の例:
mCircleShape.setOnClickListener(
{ _ -> ToastUtils.showSuccessMessage(context,"pressed") }
)
または、よりkotlinスタイルにしたい場合:
mCircleShape.listener = (
{ _ -> ToastUtils.showSuccessMessage(context,"pressed") }
)
まず、このコードを削除する必要があります。
mCircleShape.setOnClickListener(View.OnClickListener {
if (listener == null) return@OnClickListener
listener!!.onClick()
})
リスナーは最初は常にnullであり、コードは常に常に戻るためです。
var listener: OnClickListenerInterface? = null
は既に公開されています(これはKotlinのデフォルトのアクセスレベルです)。そのため、必要なときにアクティビティに設定するだけです。 listener?.onClick()
呼び出しを使用して、CircleShapeからトリガーします。