Java Android-setOnClickListener背后的逻辑

Java Android-setOnClickListener背后的逻辑,java,android,onclicklistener,Java,Android,Onclicklistener,我是Java/Android编程新手,不幸的是,我不完全理解这段代码背后的逻辑: button.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // Perform action on click } }); 我已经读了很多关于它的教程,但不幸的是,到目前为止还没有人详细解释代码。也许是因为它是如

我是Java/Android编程新手,不幸的是,我不完全理解这段代码背后的逻辑:

         button.setOnClickListener(new View.OnClickListener() {
         public void onClick(View v) {
             // Perform action on click
         }
     }); 
我已经读了很多关于它的教程,但不幸的是,到目前为止还没有人详细解释代码。也许是因为它是如此的基本,以至于每一个优秀的面向对象程序员都会立刻理解这种结构的原因

我想知道为什么我需要使用
newview.OnClickListener()
作为参数?对于
setOnClickListener
方法。换句话说,为什么

         button.setOnClickListener(
         public void onClick(View v) {
             // Perform action on click
     });  
这工作

此外,我不太清楚为什么
onClick
方法需要
View v
的参数


我非常感谢您提供的帮助,因为我现在很困惑。

查看。OnClickListener
是一个当您想要处理单击事件时需要实现的界面。在代码中,您可以通过执行
newview.OnClickListener()
来实现这一点。这里实际上是在创建一个匿名类,该类实现了
View.OnClickListener
。实现
View.OnClickListener
的任何类也必须实现其中声明的所有方法(例如
onClick
方法)。另外,在
public void onClick(视图v){..}
中,
View v
表示已单击的视图或按钮,以便您可以使用它执行任何操作。例如,获取其id、更改其颜色等。

好的,所以首先onClick方法需要一个参数作为函数。在Java中,不能像在其他语言(如C++)中那样将函数作为参数发送。Java解决方案是使用功能接口

在本例中,OnClickListener是一个接口,它有一个必须实现的方法:public void onClick(视图v)。视图v是您刚才单击的视图,因此调用了该视图的方法

setOnClickListener(OnClickListener)表示设置。。。函数需要一个实现OnClickListener的参数

因此,该代码的作用是:

new View.OnClickListener() {
         public void onClick(View v) {
             // Perform action on click
         }
     }); 

它正在创建一个匿名类来实现所需的OnClickListener接口。

想象一下,在这种情况下,它将与您定义的一样—您不传递参数,只需描述按下该按钮时要采取的操作。要不是那个按钮,它会工作得很好。您必须为每个其他按钮重新执行此方法。如果有相当多的按钮执行相同的操作,会发生什么情况?每次你都会重新定义它。简单地做一次,然后把它传给别人,不是更容易吗?另外,如果只使用一个onClick()方法来标识被单击元素的id,然后只为具有该id的小部件执行逻辑,而不使用费劲的单独代码行,不是更容易吗

另外,不要忘记所传递的参数属于视图类,它是每个其他小部件的超类。因此,如果需要,可以将为其他小部件定义的onClickListener()方法传递到此方法中(尽管这种情况实际上很少见)


为了回答您的问题,Android团队本可以按照您描述的方式进行设计,但由于最佳实践和编程模式,他们选择了这种方式。

Easy说:因为setOnClockListener将View.OnClickListener实例作为输入。onClick(视图v)只是View.OnClickListener中的一个方法。因此,将View v作为参数传递是不够的,因为这只是View实例。除此之外,如果您是面向对象编程的新手,还应该了解接口、多态性和obsever模式。