Java setOnClickListener匿名类?

Java setOnClickListener匿名类?,java,android,Java,Android,我是android开发的新手,我意识到在现实世界的示例中使用所有接口要比在示例代码中使用它们困难得多,这些示例代码试图向您展示如何使用接口 由于我想了解我键入的每一行,我将从以下内容开始: Button clearButton = (Button) findViewById(R.id.buttonClear); clearButton.setOnClickListener(new View.OnClickListener() { @Override public void on

我是android开发的新手,我意识到在现实世界的示例中使用所有接口要比在示例代码中使用它们困难得多,这些示例代码试图向您展示如何使用接口

由于我想了解我键入的每一行,我将从以下内容开始:

Button clearButton = (Button) findViewById(R.id.buttonClear);

clearButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {   
    }
});
第一行很简单,我只是根据xml中的id为button对象分配了一个button,但我不理解侦听器,我只是得到了clearButton对象,我将使用它的一个方法,
setOnClickListener
,然后在参数中传递我想要覆盖的匿名类,但是
View.OnClickListener()
方法不是对象吗?我在函数中写一个类

new View.OnClickListener() {
    @Override
    public void onClick(View v) {   
    }

这看起来像是一个函数
OnClickListener
,它包含一个内联类,所以它被称为observer模式。您将侦听器注册到UI,并告诉它在发生某些事情时调用您的代码;在这种情况下,用户单击“清除”按钮时出现问题

clearButton.setOnClickListener(mListener);
因此:

这很简单,您正在创建一个按钮对象并将其附加到布局文件中

Button clearButton = (Button) findViewById(R.id.buttonClear);
下一步:

让我重写一下:

clearButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {   
        }
    });
为此:

//First let's create an implementation of this interface.
// These are also refereed to as callback interfaces as 
//the methods in their implementation are called as whenever 
//something happens on the UI. In this call onClick is the callback    method.


private class MyButtonClicklistener implements View.OnClickListener
{
  @Override
            public void onClick(View v)
 {
//Do something on the button click   
            }

}
创建侦听器的实例

MyButtonClickListener mListener = new MyButtonClickListener();
最后注册你的听众。现在,您告诉您的UI在有人单击清除按钮时调用mListener对象的onClick方法

clearButton.setOnClickListener(mListener);

请查看。
视图。OnClickListener()
是一个构造函数,您正在匿名类上调用它。我正在构造函数中传递一个新类?正确。如果
View.OnClickListener
是一个在构造函数中包含参数的(抽象?)类,那么您可以将参数放在括号内。把它想象成调用
super()
。我从未见过一个名称中包含点的接口,我不理解它实现了视图。OnClickListener它就像从视图接口实现精确的变量,例如int?看看这个答案,特别是这个答案的注释。