Java 如何在Kotlin中使用回调?

Java 如何在Kotlin中使用回调?,java,android,xml,kotlin,listener,Java,Android,Xml,Kotlin,Listener,我有一个视图和一个圆形,在这个视图中应该显示toast。我在主要活动中使用它。 这是我的界面 interface OnClickListenerInterface { fun onClick() } 它是圆形的(在我的xml中是视图),在我的视图中是侦听器。我想在我的活动中实现OnClick var listener: OnClickListenerInterface? = null mCircleShape.setOnClickListener(View.OnClickListen

我有一个视图和一个圆形,在这个视图中应该显示toast。我在主要活动中使用它。 这是我的界面

interface OnClickListenerInterface {
  fun onClick()
}
它是圆形的(在我的xml中是视图),在我的视图中是侦听器。我想在我的活动中实现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中使用Callback,onClickListenere?

首先,您需要删除此代码:

mCircleShape.setOnClickListener(View.OnClickListener {
      if (listener == null) return@OnClickListener
      listener!!.onClick()
    })
因为监听器一开始总是空的,而您的代码总是返回


var侦听器:OnClickListenerInterface?=null
已经是公共的(这是Kotlin中的默认访问级别)。因此,您可以在需要时在活动中设置它。使用
listener?.onClick()
调用从圆圈形状触发它。

您尝试过使用lambda表达式吗?例如,在您的案例中:

mCircleShape.setOnClickListener( 
    { _ -> ToastUtils.showSuccessMessage(context,"pressed") }
)
或者,如果您想使其更具kotlin风格:

mCircleShape.listener = ( 
    { _ -> ToastUtils.showSuccessMessage(context,"pressed") }
)
关于CircleShape.kt

private listener OnClickListenerInterface? = null
...
fun setOnClickListener(listener: OnClickListenerInterface) {
    this.listener = listener
}
关于你的活动

mCircleShape.setOnClickListener(object: CircleShape.OnClickListenerInterface {
    override fun onClick() {
      // Do something here
    }
})
mCircleShape.listener = {
    // Do something when you observed a call
}
如果要使用lambda表达式,可以使用函数类型。这是它的样子 关于CirclesShapt.kt

fun setOnClickListener(listener: () -> Unit){
   listener() // or you could use optional if the lister is nullable "listener?.invoke()"
}
所以在活动中看起来像

mCircleShape.setOnClickListener {
  // Do something here
}

更简单的解决方案是使用lambda

在CircleShape.kt中,声明一个lambda函数

var listener: (()->Unit)? = null
...
// When you want to invoke the listener
listener?.invoke()
在你的活动中

mCircleShape.setOnClickListener(object: CircleShape.OnClickListenerInterface {
    override fun onClick() {
      // Do something here
    }
})
mCircleShape.listener = {
    // Do something when you observed a call
}
要使用Kotlin回调, 我在api调用中使用它们来判断成功与否 使用

为状态创建枚举类

在娱乐中使用回拨

调用函数fetchFeesList时,可以如下调用

对于toast(“消息”),请使用GitHub中的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
  }
这样使用:

  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
  }

我一直在拼命寻找一个类似于Java接口的Kotlin解决方案,直到我遇到了上面的建议。在尝试了所有这些方法之后,我无法找到一个适合我的场景的有效解决方案

这导致了我自己的实现,它根据我的用例完美地工作,因此我认为我可以在这里分享同样的东西,尽管这可能不是实现它的完美方式,但提前道歉

步骤如下:

  • 1。定义您的界面:
  • 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
mCircleShape.initOnClickListenerInterface(this)
在该活动的onCreate函数中,使用我们在CircleShape类中创建的initOnClickInterface函数初始化接口

class Activity : AppCompatActivity(), OnClickListenerInterface {
    val mCircleShape = CircleShape()
    // ...other stuff
mCircleShape.initOnClickListenerInterface(this)
然后通过在活动中添加下面的代码覆盖接口的onClick方法来完成

override fun onClick() {
        // Callback received successfully. Do your stuff here
    }
以上步骤对我很有效


正如我所说,如果我的编码有任何问题,我也是一个学习者“它不工作”-有什么错误?Listener没有帮助我实现回调。我不知道
对象:OnClickListenerInterface
部分。感谢您提供了一些解决方案:您的第二个解决方案没有演示CirclesShapt.kt中的setOnClickListener如何调用侦听器。