如何在Kotlin中使用回调?

时间:2017-11-26 19:02:35

标签: java android xml kotlin listener

我有View和一个CircleShape,它应该在此视图中显示吐司。我在主Activity中使用它。 这是我的界面

interface OnClickListenerInterface {
  fun onClick()
}

我的视图中是CircleShape(在我的xml中是View)和监听器。我想在我的Activity中实现OnClick。

 var listener: OnClickListenerInterface? = null

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

我知道,在Kotlin getter和setter通用自动装置中,但我如何设置监听器,如果它是私有的。它是我的Activity中的代码,但它不起作用

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

如何在Kotlin中使用Callback,onClickListenere?

5 个答案:

答案 0 :(得分:8)

在CircleShape.kt。

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

关于您的活动

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

如果你要使用lambda表达式,可以使用函数类型。这是它的样子 在CirclesShapt.kt

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

所以在活动中看起来像。

mCircleShape.setOnClickListener {
  // Do something here
}

答案 1 :(得分:8)

使用lambda更为简单的解决方案。

在CircleShape.kt内部,声明一个lambda函数。

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

您的活动内部

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

答案 2 :(得分:4)

要使用Kotlin回调, 我在api调用中使用它们是成功还是失败 使用

  

为状态创建枚举类

var img_list = 
    ["https:\/\/img3.example.me\/upload\/511bd439da25cc716e88a2e2ac0fb3ac.jpg"
        ,"https:\/\/img3.example.me\/upload\/77ac7d2ab7357ca181010905b228842d.jpg"
        ,"https:\/\/img3.example.me\/upload\/72387065c5464e8ce92297df783a2437.jpg"
];
var newlist=[];
img_list.forEach((e)=>{
newlist.push(e.split('example').join('example2'));
})
img_list=newlist;
console.log(img_list);
  

有趣地使用回叫

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

调用函数fetchFeesList时,调用它的方式

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

对于toast(“ message”),请使用来自GitHub的Anko Lib:-https://github.com/Kotlin/anko

答案 3 :(得分:0)

定义这样的函数:

  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
  }

答案 4 :(得分:0)

我一直在寻找一种类似于Java接口所提供的Kotlin解决方案,直到遇到上述建议为止。尝试了所有这些方法之后,我无法找到适合我的情况的可行解决方案。

这导致了我自己的实现,该实现可以根据我的用例完美地工作,因此我想可以在这里共享相同的内容,尽管这可能不是完美的实现方式,请提前道歉。

步骤:

  • 1。定义您的界面:
interface OnClickListenerInterface {
    fun onClick()
}
  • 2。在将触发“ onClick”回调(即针对您的案例的“ CircleShape”)的类中:

创建可为空的变量。

var listener: OnClickListenerInterface? = null

声明一个函数以初始化上面的变量。

fun initOnClickInterface(listener: OnClickListenerInterface){
        this.listener = listener
    }

在您要触发“ onClick”回调的位置:

mCircleShape.setOnClickListener(View.OnClickListener {
      if (listener == null) return@OnClickListener
      listener?.onClick() // Trigger the call back
    })
  • 3。在要接收“ onClick”回调的活动中:

使该活动实现OnClickListenerInterface,然后创建CircleShape类的对象。

class Activity : AppCompatActivity(), OnClickListenerInterface {
    val mCircleShape = CircleShape()
    // ...other stuff

在此活动的onCreate函数中,使用我们在CircleShape类中创建的initOnClickInterface函数初始化您的界面。

mCircleShape.initOnClickListenerInterface(this)

然后通过在活动中添加以下代码来覆盖我们界面的onClick方法来结束。

override fun onClick() {
        // Callback received successfully. Do your stuff here
    }

以上步骤对我有用。

正如我所说,如果我的编码有任何问题,我也是学习者。

干杯!