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要求调用带有接口参数的函数。