我有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?
答案 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解决方案,直到遇到上述建议为止。尝试了所有这些方法之后,我无法找到适合我的情况的可行解决方案。
这导致了我自己的实现,该实现可以根据我的用例完美地工作,因此我想可以在这里共享相同的内容,尽管这可能不是完美的实现方式,请提前道歉。
步骤:
interface OnClickListenerInterface {
fun onClick()
}
创建可为空的变量。
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
})
使该活动实现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
}
以上步骤对我有用。
正如我所说,如果我的编码有任何问题,我也是学习者。
干杯!