如何在 Kotlin 使用回调?

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

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 的 getters 和 setter 通用自动机,但我如何设置监听器,如果它私有。这是我的活动代码,但它不工作

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

如何在 Kotlin 使用 Callback,onclickListenere?

118404 次浏览

首先,您需要删除以下代码:

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

因为侦听器一开始总是 null,而您的代码总是返回。

var listener: OnClickListenerInterface? = null已经公开(这是 Kotlin 的默认访问级别)。所以你可以在需要的时候在你的活动中设置它。使用 listener?.onClick()调用从 CircleShape 触发它。

你试过使用 lambda 表达式吗? 例如:

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

或者如果你想让它更有科特林风格:

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
}
})

如果你要使用 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.listener = {
// Do something when you observed a call
}

用科特林的复试, 我用它们来判断 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")
}
}

对于吐司(“ 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
}

我一直在拼命寻找类似于 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
}

以上步骤对我很有效。

如我所说,如果我的代码有任何问题,我也是一个学习者。

干杯!