web-dev-qa-db-ja.com

Kotlinでコールバックを使用するにはどうすればよいですか?

ビューと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を使用するにはどうすればよいですか?

17
manwhotrycoding

ラムダを使用した、より簡単なソリューション。

CircleShape.kt内で、ラムダ関数を宣言します。

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

あなたの活動の中

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

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
}
14
dr3k

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

5
Rishabh Shukla

次のような関数を定義します。

  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
  }
1
Dan Alboteanu

ラムダ式を使用しようとしましたか?あなたの場合の例:

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

または、よりkotlinスタイルにしたい場合:

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

まず、このコードを削除する必要があります。

mCircleShape.setOnClickListener(View.OnClickListener {
      if (listener == null) return@OnClickListener
      listener!!.onClick()
    })

リスナーは最初は常にnullであり、コードは常に常に戻るためです。

var listener: OnClickListenerInterface? = nullは既に公開されています(これはKotlinのデフォルトのアクセスレベルです)。そのため、必要なときにアクティビティに設定するだけです。 listener?.onClick()呼び出しを使用して、CircleShapeからトリガーします。

0