Android studio 什么时候在setOnClickListener上写内部()或{}?安卓工作室
我有这两个例子,我不明白为什么你应该使用冒号或大括号Android studio 什么时候在setOnClickListener上写内部()或{}?安卓工作室,android-studio,kotlin,mobile,onclicklistener,Android Studio,Kotlin,Mobile,Onclicklistener,我有这两个例子,我不明白为什么你应该使用冒号或大括号 binding.playButton.setOnClickListener( Navigation.createNavigateOnClickListener(R.id.action_titleFragment_to_gameFragment) ) binding.playButton.setOnClickListener { view: View -> Navigat
binding.playButton.setOnClickListener(
Navigation.createNavigateOnClickListener(R.id.action_titleFragment_to_gameFragment)
)
binding.playButton.setOnClickListener { view: View ->
Navigation.findNavController(view).navigate(R.id.action_titleFragment_to_gameFragment)
}
binding.playButton.setOnClickListener { TODO("Not yet implemented") }
第一个场景-应侦听多个视图的单击侦听器:
val clickListener = { view: View ->
when (view.tag) { // or view.id
// ...
}
}
binding.playButton.setOnClickListener(clickListener)
binding.pauseButton.setOnClickListener(clickListener)
第二个场景-仅用于一个按钮的侦听器:
binding.playButton.setOnClickListener { view ->
startPlaying()
}
看起来你有一些监听器工厂之王,所以第一种方法更可取。简单的答案是使用大括号{}来写一段代码(多行),使用括号()来写一行,如果有帮助的话,
视图。OnClickListener
是一个接口,因此,当您调用setOnClickListener
时,您提供了该接口的一个实现:
binding.playButton.setOnClickListener(object: View.OnClickListener {
override fun onClick(p0: View?) {
TODO("Not yet implemented")
}
})
因此,在本例中,您正在创建一个实现接口的对象(如匿名类),其主体包含需要重写的函数。您正在setOnClickListener
方法调用中将此对象作为参数传递。(这基本上就是第一个示例中发生的情况,您只是调用另一个函数来为您生成对象)
但是因为这个接口中只有一个函数,所以可以将整个过程分解为一个lambda,就像一个匿名函数一样。只要它与接口中单个函数的签名匹配,它就被接受为一个实现
binding.playButton.setOnClickListener({ p0 -> TODO("Not yet implemented") })
当它是这样一个单参数时,如果代码需要引用它,您可以删除变量名,它将被称为it
(如果有多个参数,您需要显式命名)
这个函数放在大括号中,是一段代码。因此,我们有两个括号(因为我们正在进行方法调用)和大括号(将作为参数传递给方法的函数分隔开来)
但是Kotlin还允许我们将这样的函数参数移到括号外,如果它是调用中的最后一个参数。因此,如果您正在制作这样的正方形列表:
nums = List(4, { it * it })
您可以将初始化功能移到外部,使其更整洁
nums = List(4) { it * it }
当函数是唯一的参数时,可以完全删除括号
nums.map { it * it } // equivalent to nums.map({it * it})
这就是第二个示例中发生的情况-您正在创建一个lambda,它是click listener接口的一个实现,并将其传递到setOnClickListener
,因为它是唯一的参数,所以您只需将括号中的lambda放在它的大括号中
binding.playButton.setOnClickListener(
Navigation.createNavigateOnClickListener(R.id.action_titleFragment_to_gameFragment)
)
binding.playButton.setOnClickListener { view: View ->
Navigation.findNavController(view).navigate(R.id.action_titleFragment_to_gameFragment)
}
binding.playButton.setOnClickListener { TODO("Not yet implemented") }
希望这能把事情弄清楚!衣帽匠通常会给你一些提示和快速修复方法,把东西清理成你喜欢的样式这是不正确的。大括号是lambda函数。括号用于传递参数,而不是可调用的代码。我说的是一般用法,括号不是lambda独有的,请注意,我从“简单答案”开始,就像你可以做playButton.setOnClickListener(v:View->print(v.tag))或playButton.setOnClickListener(v:View->{print(v.tag)print(v.tag)print(v.tag)print(v.tag)});组合函数与OP要求的完全不同,OP要求调用带有接口参数的函数。