我不完全理解 onClickListeners

I don't fully understand onClickListeners

所以当我们将 onClickListener 设置为按钮时,它看起来像这样。

private Button myButton = (Button) findViewById(R.id.my_button);

myButton.setOnClickListener(new View.OnClickListener(){

    @Override
    public void onClick(View view){
        //do this
    }

});

因此,当我们声明新的 View.OnClickListener... 并实现 OnClickListener 接口/并覆盖它的 onClick 方法时,我们正在创建一个无名的匿名 class。我不明白的是,如果我们没有引用这个 anon class,因为它是无名的,那么如何调用 onClick() 方法?我只实现了一个匿名 class 来覆盖所述 class 中的某些方法,如下所示:

public class Foo{
    public void bar(){
        //do something
    }
}


Foo foo = new Foo(){
    @Override
    public void bar(){
        //do something else
    }
}

这对我来说非常有意义,因为现在,只要我使用 "foo" 引用来调用 bar() 方法,该引用就会使用 bar 的覆盖版本。对于 Button,没有对 onClick() 的引用。我对此一头雾水。

What I don't understand, is if we have no reference to this anon class, because it's nameless, how does the onClick() method get called?

myButton 持有您创建的匿名内部 class 的实例。 myButton,因此,可以对其调用onClick()

在按钮对象中调用 onclick 事件,此对象使用您设置的引用委托给您的匿名 class onclick。

如果对你的理解有帮助,你可以重写为:

View.OnClickListener listener = new View.OnClickListener(){
    @Override
    public void onClick(View view){
        //do this
    }
};
myButton.setOnClickListener(listener);

按钮在侦听器超出范围后保留引用,并且可以在保留的侦听器对象上调用 onClick 回调。