Java 如何在Kotlin中使用回调?
我有一个视图和一个圆形,在这个视图中应该显示toast。我在主要活动中使用它。 这是我的界面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
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”回调的活动中:
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如何调用侦听器。